将多个注释与参数合并

时间:2017-04-28 11:53:39

标签: java frameworks annotations code-structure

我有一个使用多个注释的问题,所有注释都说或多或少是相同的东西,但不同的框架,我想将它们全部组合成一个自定义注释。目前它看起来像这样:

@Column(name = "bank_account_holder_name")
@XmlElement(name = "bank_account_holder_name")
@SerializedName("bank_account_holder_name")
@ApiModelProperty(name = "bank_account_holder_name", value = "The name of the recipient bank account holder")
public String bankAccountHolderName;

正如你所看到的,他们都重复相同的字符串,我想将它们结合起来,但我还没有找到一种方法。

是否可以这样做,或者我是否必须继续这样做或更改/创建新框架?

2 个答案:

答案 0 :(得分:3)

答案是:可能不,这是不可能的(使用"标准" java)。

你知道,注释中没有 inheritance ,但是单独的"多个"继承,这将允许你表达:

public @interface MultiAnnotiation extends Column, XmlElement, ...

最有可能的是,这些注释的工作原理如下:在运行时,相应的框架使用反射来检查某个对象是否具有该注释。如果它没有找到"它的"注释,没有任何反应。

所以你需要一种方法来神奇地"将这些注释插入到您的类文件中。

归结为:当你编写自己的编译器,并在java之上发明一些东西时,你可以做类似的事情。

在处理编译器插件附带的注释时可能会有所不同(意思是:在编译时处理的注释)。也许您可以编写自己的自定义注释,然后触发相同编译时操作。

长话短说:所有这些都是有趣的,而是高级,而且最有可能的是:不会产生强大的,具有生产价值的代码!

答案 1 :(得分:1)

可以将一些注释合并到一个注释中。例如,Spring在SpringBootApplication-Annotation中执行它:

/**
 * Indicates a {@link Configuration configuration} class that declares one or more
 * {@link Bean @Bean} methods and also triggers {@link EnableAutoConfiguration
 * auto-configuration} and {@link ComponentScan component scanning}. This is a convenience
 * annotation that is equivalent to declaring {@code @Configuration},
 * {@code @EnableAutoConfiguration} and {@code @ComponentScan}.
 *
 * @author Phillip Webb
 * @since 1.2.0
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {

    /**
     * Exclude specific auto-configuration classes such that they will never be applied.
     * @return the classes to exclude
     */
    Class<?>[] exclude() default {};

}

但我不知道是否可以从合并注释中为内部注释设置值。