7

我创建了一个注解,将它应用到一个 DTO 并编写了一个 Java 1.6 风格的注解处理器。我可以看到如何让 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
    }
}
4

4 回答 4

6

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

于 2010-04-29T01:46:05.927 回答
6

您正在寻找“Instrumentation”,这是 AspectJ 之类的框架所做的。在这种情况下,您必须在命令行中使用“-agent”选项指定一个 jar,然后才能过滤所有加载的类。在此过滤步骤中,您可以检查注释,并在字节码加载到虚拟机之前对其进行修改。进行实际字节码修改的库包括“asm”,也许还有高级包装器“cglib”和“javassist”。您甚至可以预编译您的类以生成必须由您检测的类列表,以使开始时的过滤更快一些。

有关更多信息,请参阅 java.lang.instrumentation。

于 2010-05-04T18:48:45.550 回答
5

你必须使用内部编译器的类——一些灵感:

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

BTW:如果你想在 Eclipse 中使用它,你应该为它添加一些特殊的支持,因为 Eclipse 使用非标准编译器。你的设计应该更复杂,你应该为你的处理器添加一个抽象级别——就像Lombok一样。

于 2012-04-05T16:35:04.183 回答
-2

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

于 2010-04-28T08:20:54.823 回答