将多个注释与参数合并

merge multiple annotations with parameters

我在使用多个注解时遇到问题,这些注解都或多或少地表达了相同的内容,但针对不同的框架,我想将它们全部分组到一个自定义注解中。目前看起来像这样:

@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;

如您所见,它们都重复相同的字符串,我想将它们组合起来,但我还没有找到这样做的方法。

完全有可能做到这一点,还是我必须继续这样做或 change/create 一个新框架?

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

你看,没有 inheritance 注释,只有 "multiple" 继承可以让你表达:

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

而且这些注释很可能是这样工作的:在运行时,相应的框架使用反射来检查某个对象是否具有注解。如果它没有找到 "its" 注释,则什么也不会发生。

所以您需要一种方法来 "magically" 将这些注释插入到您的 class 文件中。

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

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

长话短说:所有这些听起来 有趣,但更像是 先进,而且很可能:不会产生稳健的生产-有价值的代码!

可以将一些注释合并为一个注释。 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 {};

}

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