我创建了一个注释,将其应用于 DTO 并编写了一个 Java 1.6 样式的 annotationProcessor。我可以看到如何让 annotationProcessor 编写一个新的源文件,这不是我想要做的,我看不到或不知道如何让它修改现有类(最好只修改字节码)。修改实际上相当简单,我希望处理器做的就是插入一个新的 getter 和 setter,其中名称来自正在处理的注释的值。
我的注释处理器看起来像这样;
@SupportedSourceVersion(SourceVersion.RELEASE_6)
@SupportedAnnotationTypes({ "com.kn.salog.annotation.AggregateField" })
public class SalogDTOAnnotationProcessor extends AbstractProcessor {
@Override
public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) {
//do some stuff
}
}
最佳答案
您正在寻找“仪器”,这就是 AspectJ 之类的框架所做的。在这种情况下,您必须在命令行中使用“-agent”选项指定一个 jar,然后才能过滤所有加载的类。在此过滤步骤中,您可以检查注释,并在字节码加载到虚拟机之前修改字节码。用于进行实际字节码修改的库包括“asm”,也许还有高级包装器“cglib”和“javassist”。您甚至可以预编译您的类以生成必须由您检测的类列表,以便在开始时更快地进行过滤。
有关更多信息,请参阅 java.lang.instrumentation。