我有两个类与方法,我想将两个类的方法合并到一个类。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也有增量编译的模式,所以我猜他们也不能正确使用这样的注释处理器。 –