Ciao, vorrei inizializzare un attributo annotato via APT usando il sun javac tool
Il mio problema da spiegare è abbastanza semplice ma non riesco a venirne a capo.
Quello che intendo fare è agganciare una inizializzazione a un campo annotato. Esempio:
incodice:@MyAnnotation public Type field;
Nella mia applicazione di test ho un campo String annotato con una mia annotazione che una volta ripescata tramite APT provo a instrumentare con il tool di javac ,codice:@MyAnnotation public Type field = MyClass.method(args);
ecco il pezzo di codice saliente che vorrebbe trasformare il campo :
String pewe; -> String pewe = cancellami.Pewe.giveMe("... unreal");
codice:JCTree.JCVariableDecl fieldNode = (JCTree.JCVariableDecl) elementUtils.getTree(field); .. .. JCMethodInvocation invocationPewe = maker.Apply( nil, ident(" cancellami.Pewe.giveMe"),List.<JCExpression>of(maker.Literal("... unreal"))); CExpressionStatement execPewe = maker.Exec(invocationPewe); fieldNode.init = execPewe.expr;
la classe Pewe è la seguente :
la compilazione però fallisce perché non trova il package "cancellami" .. che invece esiste benissimo..codice:package cancellami; public class Pewe { private String ss; public Pewe(String s) { this.ss = s; } @Override public String toString() { return giveMe(ss); } public static String giveMe(String word){ return "this is the word: "+word; } }
package cancellami does not exist
public class TestMain { 1 error ...![]()
Ma se invece cambio il tipo dell'attributo in Pewe per esempio, e nel processore di annotazioni inizializzo l'attributo come di seguito tutto funziona e mi ritrovo iniettato il valore correttamente.
codice:JCExpression newPewe = maker.NewClass(null, null, ident("cancellami.Pewe"), List.<JCExpression>of(maker.Literal("... unreal")), null); fieldNode.init = newPewe;
Vi prego di aiutarmi perché non so più dove sbattere la testa e in giro non trovo la giusta documentazione.. :S

Rispondi quotando