Ein abstrakter Syntaxbaum (AST). http://home.a00.itscom.net/hatada/c-tips/ast/ast01.html
Analysieren Sie den Quellcode und generieren Sie einen Baum mit jedem Knoten als Blatt.
JavaPerser https://github.com/javaparser/javaparser/wiki
Wenn Sie die Bibliothek von com.sun.tools.javac.model verwenden, können Sie den Zwischen-AST zur Kompilierungszeit ändern ...? ??
Um den Quellcode zu analysieren, analysieren Sie ihn mit dem folgenden Code und konvertieren Sie ihn in den CompilationUnit-Typ. In diesem Argument können Sie InputSteream, File usw. angeben.
JavaParser.parse([source]);
Nach der Konvertierung in CompilationUnit können Sie das Objekt abrufen, das jeden Knoten darstellt, und es von dort aus ändern.
Die Knoten, die direkt von der Kompilierungseinheit bezogen werden können, sind:
Wenn Sie die Knoten in Class (oder Interface) verarbeiten möchten, rufen Sie ClassOrInterfaceDeclaration möglicherweise einmal ab und ändern Sie sie.
targetclass.getMethodsByName("testMethod1")
Jetzt können Sie eine Liste der Knoten MethodDeclarations abrufen, die Methoden mit dem Namen "testMethod1" darstellen. (Wenn es denselben Namen gibt, wird er entsprechend zur Liste hinzugefügt.)
Modifikator bezieht sich auf privat oder so ähnlich
Auch, wenn Sie eine Methode mit einem Argument erhalten möchten.
//Sie können eine Methode mit String und int als Argumente mit dem Namen methodName abrufen.
ClassOrInterfaceDeclaration.getMethodsBySignature(String new methodName, new String[] {"String","int"});
Wenn Sie remove () so wie es ist aufrufen, verschwindet es.
Rufen Sie setName (String name) auf. Kann auch über das SimpleName-Objekt zugewiesen werden
Ändern Sie die Initialisierung mit setInitializer von VariableDeclarator. Das Argument ist vom Typ Ausdruck, der von JavaParser.parseExpression erstellt werden kann.
VariableDeclarator.setInitializer(JavaParser.parseExpression(content));
Verwenden Sie ClassOrInterfaceDeclaration wie zuvor. Durch Aufrufen von add *** dieses Objekts können Sie das Objekt abrufen, das den Knoten darstellt, sowie den Knoten hinzufügen.
//private ScanSize[] aaa;Hinzufügen
FieldDeclaration field = targetclass.addField(ScanSize[].class, "aaa", Modifier.PRIVATE);
Wenn Sie den an anderer Stelle erstellten VariableDeclarator in setVariable () dieses Feldobjekts einfügen, wird er unverändert eingegeben.
Vielleicht kann die Methode auch gehen, vielleicht.
Holen Sie sich Ihre eigene Quelle und analysieren Sie
Path selfSource = Paths.get("[Quellpfad]");
Auf diese Weise können Sie beliebige Deklarationen erhalten. Sie müssen also nur in eine andere Datei eintauchen.
Ausführlicher Artikel über Java Parser https://qiita.com/opengl-8080/items/50ddee7d635c7baee0ab#%E5%8F%82%E8%80%83
AST-Konvertierung im Anmerkungsprozessor - Ändern Sie den Variablentyp zur Kompilierungszeit unter Bezugnahme auf Lombok http://fits.hatenablog.com/entry/2015/01/17/172651
Recommended Posts