我有兩個類與方法,我想將兩個類的方法合併到一個類。AnnotationProcessor使用多個源文件創建一個文件
@Service("ITestService")
public interface ITest1
{
@Export
void method1();
}
@Service("ITestService")
public interface ITest2
{
@Export
void method2();
}
的結果應該是:
public interface ITestService extends Remote
{
void method1();
void method2();
}
我AnnotationProcessor的第一次運行產生正確的輸出(因爲RoundEnvironment同時包含類)。
但是,如果我編輯類之一(例如添加新的方法),RoundEnviroment僅包含所編輯的類,因此結果被follwing(添加newMethod()接口ITest1)
public interface ITestService extends Remote
{
void method1();
void newMethod();
}
現在method2丟失。我不知道如何解決我的問題。有沒有辦法(Enviroment),來訪問項目中的所有課程?還是有另一種方法來解決這個問題?
生成這個類的代碼很長,所以這裏簡要說明我如何生成這個類。我通過與env.getElementsAnnotatedWith(Service.class)
元素迭代並提取方法,並將其寫入新文件:
FileObject file = null;
file = filer.createSourceFile("com/test/" + serviceName);
file.openWriter().append(serviceContent).close();
你在Eclipse中運行這個批註處理器嗎? –
@ johncarl的觀點很重要,必須是真實的。標準的Java編譯器不允許增量編譯。 RoundEnvironment沒有辦法只能包含一個文件。 Eclipse編譯器是增量式的,只編譯已更改的文件。看起來這個邏輯對你來說不起作用,你需要通過Eclipse向一個給定的文件重新編譯。可能有些事情我們可以嘗試,但首先,爲了避免浪費精力,我們應該確定這隻會影響Eclipse編譯。 – Pace
@Pace:是否指定了某處javac從不使用增量編譯?我認爲ant和maven也有增量編譯的模式,所以我猜他們也不能正確使用這樣的註釋處理器。 –