Un arbre de syntaxe abstraite (AST). http://home.a00.itscom.net/hatada/c-tips/ast/ast01.html
Analysez le code source et générez une arborescence avec chaque nœud comme feuille.
JavaPerser https://github.com/javaparser/javaparser/wiki
Si vous utilisez la bibliothèque de com.sun.tools.javac.model, vous pouvez changer l'AST intermédiaire au moment de la compilation ...? ??
Pour analyser le code source, analysez-le avec le code suivant et convertissez-le en type CompilationUnit. Vous pouvez spécifier InputSteream, File, etc. dans cet argument.
JavaParser.parse([source]);
Une fois converti en CompilationUnit, vous pouvez obtenir l'objet qui représente chaque nœud, afin de pouvoir le modifier à partir de là.
Les nœuds pouvant être obtenus directement à partir de l'unité de compilation sont:
Peut-être que si vous souhaitez traiter les nœuds dans Class (ou Interface), obtenez une fois ClassOrInterfaceDeclaration et modifiez-le.
targetclass.getMethodsByName("testMethod1")
Vous pouvez maintenant obtenir une liste de noeuds MethodDeclarations qui représentent des méthodes avec le nom "testMethod1". (S'il y a le même nom, il sera ajouté à la liste en conséquence)
Le modificateur fait référence à privé ou à quelque chose du genre
Aussi, si vous souhaitez obtenir une méthode avec un argument.
//Vous pouvez obtenir une méthode avec String et int comme arguments avec le nom methodName.
ClassOrInterfaceDeclaration.getMethodsBySignature(String new methodName, new String[] {"String","int"});
Si vous appelez remove () tel quel, il disparaît.
Appelez setName (nom de chaîne). Peut également être affecté à l'aide de l'objet SimpleName
Modifiez l'initialisation avec setInitializer de VariableDeclarator. L'argument est de type Expression, qui peut être créé par JavaParser.parseExpression.
VariableDeclarator.setInitializer(JavaParser.parseExpression(content));
Utilisez ClassOrInterfaceDeclaration comme avant. Vous pouvez appeler add *** sur cet objet pour obtenir l'objet qui représente ce nœud lors de son ajout.
//private ScanSize[] aaa;Ajouter
FieldDeclaration field = targetclass.addField(ScanSize[].class, "aaa", Modifier.PRIVATE);
Si vous placez le VariableDeclarator créé ailleurs dans setVariable () de cet objet de champ, il sera entré tel quel.
Peut-être que la méthode peut aussi bien fonctionner.
Obtenez votre propre source et analysez
Path selfSource = Paths.get("[Chemin source]");
En faisant cela, vous pouvez obtenir des déclarations arbitraires etc., donc tout ce que vous avez à faire est de plonger dans un autre fichier
Article détaillé sur Java Parser https://qiita.com/opengl-8080/items/50ddee7d635c7baee0ab#%E5%8F%82%E8%80%83
Conversion AST dans le processeur d'annotations - changer le type de variable au moment de la compilation en référence à Lombok http://fits.hatenablog.com/entry/2015/01/17/172651
Recommended Posts