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)
您正在寻找"Instrumentation",这是像AspectJ那样的框架.在这种情况下,您必须在命令行中使用"-agent"选项指定jar,然后可以过滤所有已加载的类.在此过滤步骤中,您可以检查注释,并在将字节码加载到虚拟机之前修改它.用于执行实际字节码修改的库包括"asm",也可能是高级包装器"cglib"和"javassist".您甚至可以预编译您的类以生成必须由您检测的类列表,以便在开始时更快地进行过滤.
有关详细信息,请参阅java.lang.instrumentation.
您必须使用内部编译器的类-一些启发:
但这是边缘政策。您的程序只能在Sun / OpenJDK上编译,将来的版本中可能会出现问题(内部API可能会更改)。尽管已编译,但它是标准字节码,将在任何地方运行。
顺便说一句:如果要在Eclipse中使用它,则应该为其添加一些特殊支持,因为Eclipse使用非标准的编译器。您的设计应该更复杂,并且应该像Lombok一样为处理器添加一个抽象级别。
Xr.*_*Xr. -2
您必须javac为此扩展编译器,这意味着构建您的程序不会像常规应用程序那样可移植。有关某人如何实现这一目标的更多详细信息,请参阅http://weblogs.java.net/blog/cayhorstmann/archive/2006/06/say_no_to_prope.html 。
| 归档时间: |
|
| 查看次数: |
8589 次 |
| 最近记录: |