/ / Come caricare una classe dal processore delle annotazioni in eclissi? - java, eclipse, annotazioni, classpath, classloader

Come caricare una classe dal processore delle annotazioni in eclissi? - java, eclipse, annotazioni, classpath, classloader

Ho implementato un processore di annotazione e sto cercando di caricare una classe a cui fa riferimento un elemento nidificato del file corrente in elaborazione, ad esempio il tipo restituito di un metodo.

Quando eseguo questo codice dalla riga di comando con javac e passando il percorso di classe del progetto corrente, viene eseguito correttamente, ma quando utilizzo eclipse ottengo una classe ClassNotFoundException. Vedere l'esempio seguente:

public class MyAnnotationProcessor extends AbstractProcessor {

@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {

for (TypeElement element : annotations) {
try {
TypeElement type = getMethodReturnType(element);
Class<?> class1 = Class.forName(type.getQualifiedName().toString());
// ..
// do some processing with class1
// ...

} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return false;
}

Ho scoperto che in Eclipse il processore non funzionaavere il classpath del progetto corrente. Potrei creare un URLClassLoader per caricare quelle classi richieste ma non riesco a trovare un modo per ottenere il percorso del progetto corrente.

C'è un modo per ottenere il percorso del progetto dal processore di annotazioni?

risposte:

0 per risposta № 1

Mi arrendo su questo, sembra che tunon dovresti caricare le classi di riferimento dal processore di annotazioni, ma dovresti usare typeUtils e elementUtils dall'ambiente di elaborazione per qualsiasi cosa tu abbia bisogno.

Sembra che tu possa fare qualsiasi cosa, ma invocare il codice nella classe di riferimento, ad esempio, per verificare che un determinato tipo implementa un'interfaccia:

TypeMirror interfaceType = processingEnv.getElementUtils().getTypeElement("my.interfaceType").asType();
if(processingEnv.getTypeUtils().isAssignable(type, interfaceType)){
// do something
}