如何使用Java 1.6 Annotation Processing执行编译时编织?

Ste*_*eve 7 java annotations compile-time-weaving annotation-processing

我创建了一个注释,将其应用于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
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

按照设计,注释处理工具不允许直接修改正在处理的源代码.但是,可以生成正在处理的类型的子类或正在处理的类型的超类.通过一些规划,这确实允许修改相关类型的一些效果.我写了一个如何将它组合在一起的例子; 请参阅此博客条目以获取更详细的说明和一些示例代码.


Dan*_*iel 6

您正在寻找"Instrumentation",这是像AspectJ那样的框架.在这种情况下,您必须在命令行中使用"-agent"选项指定jar,然后可以过滤所有已加载的类.在此过滤步骤中,您可以检查注释,并在将字节码加载到虚拟机之前修改它.用于执行实际字节码修改的库包括"asm",也可能是高级包装器"cglib"和"javassist".您甚至可以预编译您的类以生成必须由您检测的类列表,以便在开始时更快地进行过滤.

有关详细信息,请参阅java.lang.instrumentation.


Fra*_*nta 5

您必须使用内部编译器的类-一些启发:

但这是边缘政策。您的程序只能在Sun / OpenJDK上编译,将来的版本中可能会出现问题(内部API可能会更改)。尽管已编译,但它是标准字节码,将在任何地方运行。

顺便说一句:如果要在Eclipse中使用它,则应该为其添加一些特殊支持,因为Eclipse使用非标准的编译器。您的设计应该更复杂,并且应该像Lombok一样为处理器添加一个抽象级别。


Xr.*_*Xr. -2

您必须javac为此扩展编译器,这意味着构建您的程序不会像常规应用程序那样可移植。有关某人如何实现这一目标的更多详细信息,请参阅http://weblogs.java.net/blog/cayhorstmann/archive/2006/06/say_no_to_prope.html 。