我正在尝试编写一个注释处理器来在类上插入方法和字段......而且文档非常稀疏.我没有走得太远,我不知道我是否正确接近它.
处理环境提供了一个Filer对象,该对象具有用于创建新源和类文件的方便方法.那些工作正常,但后来我试图弄清楚如何读取现有的源文件,它提供的只是"getResource".所以在我的处理器实现中我做到了:
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
try {
for (TypeElement te : annotations) {
for (Element element : roundEnv.getElementsAnnotatedWith(te)) {
FileObject in_file = processingEnv.getFiler().getResource(
StandardLocation.SOURCE_PATH, "",
element.asType().toString().replace(".", "/") + ".java");
FileObject out_file = processingEnv.getFiler().getResource(
StandardLocation.SOURCE_OUTPUT, "",
element.asType().toString().replace(".", "/") + ".java");
//if (out_file.getLastModified() >= in_file.getLastModified()) continue;
CharSequence data = in_file.getCharContent(false);
data = transform(data); // run the macro processor
JavaFileObject out_file2 = processingEnv.getFiler().createSourceFile(
element.asType().toString(), element);
Writer w = out_file2.openWriter();
w.append(data);
w.close();
} …Run Code Online (Sandbox Code Playgroud) 我一直在试注注释处理器中的代码生成.
考虑以下代码,添加一个在其中包含语句的构造函数.
private void addRegister(ExecutableElement el) {
MethodSpec builder = MethodSpec.constructorBuilder().addStatement("$T.register(this)", EventExecutor.class).build();
TypeSpec spec = TypeSpec.classBuilder(el.getEnclosingElement().getSimpleName().toString()).addOriginatingElement(el).addMethod(builder).build();
JavaFile file = JavaFile.builder(pEnv.getElementUtils().getPackageOf(el.getEnclosingElement()).getQualifiedName().toString(), spec).build();
pEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, file.toString());
}
Run Code Online (Sandbox Code Playgroud)
现在,当在"Test"类中给出一个名为"bla"的可执行元素时,结果如下:
class Test {
Test() {
EventExecutor.register(this);
}
}
Run Code Online (Sandbox Code Playgroud)
但是这个类已经存在,我想将构造函数追加到现有代码中,而不是在这里创建这个新类.
现有代码:
public class Test {
@Event
public void bla(TestEvent event) {
}
}
Run Code Online (Sandbox Code Playgroud)
我可以这样做吗?