用法示例:
我希望把类字段的自定义注释@MyContainer,然后在所有这些领域相关的Hibernate注解(根据字段类型和属性)自动添加。
在另外我需要JAXB XmlType将注释添加到类和立足于类名的类型名称。
我想另外添加注解基于thier类型的字段等,所有添加的注释应该可以在运行时(因为Hibernate / JAXB可以找到它们)。
我知道以下选项:
- 前处理类源(坏的选择)
- 与javax.annotation.processing中的API在编译期间处理
- 后编译操纵的工具,如Java协助
- 类加载与java.lang.instrument中的API时的操作
- 使用AspectJ这样做(没有足够强大)
我的主要目标是:
- 保留类和源调试之间同步
- 支持来自Maven和IDE工作(的Eclipse /的IntelliJ)
我会很感激,如果谁已经做了这样的事情的人可以推荐这样的任务(也许是潜在的陷阱)的最佳方法。
下面是用于定义自定义注释的代码示例。 这@TesterInfo被应用在一流水平,存储测试者的详细信息。 这说明不同的使用返回类型 - 枚举,数组和字符串。
package com.mkyong.test.core;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE) //on class level
public @interface TesterInfo {
public enum Priority {
LOW, MEDIUM, HIGH
}
Priority priority() default Priority.MEDIUM;
String[] tags() default "";
String createdBy() default "Mkyong";
String lastModified() default "03/01/2014";
}
我认为预处理类来源应该是您的首选方式。 这使你有你的源代码保持同步编译的类,正如你所说,这是很好的调试。 但是,这也是很好的版本控制,因为你可以在这些生成的注释进行检查。 这也是很多更难以追查问题在你的工具,如果它是在编译过程中运行它。 在产生污染源阶段运行的代码生成时,IDE的支持也应该没有问题。
编辑:快速搜索产生约程序的Java源修改某些相关信息使用Eclipse JDT或NetBeans中的一些事情 。 但是,这可能是值得一些更多的研究和其自身的问题。
我想建议对另一种方法。 正如我的第一个答案可能涉及到编码的自己的工具,你也可以尝试一个更简单的解决方案。 正如我希望你是单元测试你的类,你可以实现一个基类,这样的类的每个单元测试。 在该基类有一个测试方法,检查与注释的每一个字段@MyContainer
也具有所需的休眠注释。
我们基本上做同样的事情,而不是注释但对于字段串行化,并与运行方式非常好。
有它的工作最透明的IDE,命令行构建和运行时,选项1(使用APT)和选项5(使用AspectJ)会给你最合适的。
对于第一种情况,你必须实现自己的批注处理器将注入根据自己@MyContainer注释存在额外的注解。 下面是这种方法用于一个例子类似的东西 。
对于选项5,你可以简单地使用注释声明 。 事情是这样的:
declare @field : * ((@*..MyContainer *)).*(..) : @OtherAnnotation();
Spring的Roo的工具被广泛使用选项5,我当然不能说这是不够强大。
有几个选择如上所述,并各有其上涨空间和缺点。 这就是为什么我不认为在那里做了上述问题的一个真正的“正确”的答案。 我的目的是要得到社会各界和谁在过去做了这样的事情,并有经验的人投入。 就个人而言,我选择使用仪器API用Javassist。 通过这种方式,类上运行时间延长(虽然相同的工具,可用于交编译处理)。 这种做法的好处是,代理可以从中避免处理所有的命令行JVM内部装载。 这将是巨大的,听到其他的替代品。
谢谢,
阿夫纳