2015-10-15 41 views
1

我實現了一個Annotation Processor,我試圖加載一個被當前正在處理的文件的嵌套元素引用的類,例如方法的返回類型。如何從eclipse中的註釋處理器加載類?

當我使用javac從命令行運行此代碼並傳遞當前項目classpath時,它成功運行,但是在使用eclipse時,我得到一個ClassNotFoundException異常。看下面的例子:

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; 
} 

我發現在eclipse中處理器沒有當前項目的類路徑。我可以創建一個URLClassLoader來加載這些必需的類,但是無法找到獲取當前項目路徑的方法。

有沒有辦法從註解處理器獲取項目路徑?

+0

嗯,類路徑和源路徑設置會自動傳遞給註釋處理器基於項目設置,所以問題可能與您的項目設置本身有關。你確定你已經爲你的項目啓用了註釋處理嗎? –

+0

是的,我非常確定註釋處理已啓用,對於沒有類需要加載的文件,它工作正常。 Eclipse提到了你說的話,但似乎沒有這樣做: >注意:諸如「-classpath」和「-sourcepath」之類的選項會自動傳遞給所有處理器,其值與項目的Java設置相對應。 當我從處理器中獲取類路徑時,使用系統屬性它只會從eclipse返回jar,而從處理器的類加載器中我只能得到eclipse的路徑。我正在與eclipse Mars @SasikanthBharadwaj合作 – Abraham

回答

0

我放棄了這個,看來你不應該從註解處理器加載引用的類。相反,你應該使用處理環境中的typeUtils和elementUtils來處理任何你需要的東西。

看來,你可以做任何事情,但在引用類中調用的代碼,例如,要驗證一個給定類型實現了一些接口:

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