将多个注释与参数合并
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 {};
}
但我不知道是否可以从合并的注释中为内部注释设置一个值。
我在使用多个注解时遇到问题,这些注解都或多或少地表达了相同的内容,但针对不同的框架,我想将它们全部分组到一个自定义注解中。目前看起来像这样:
@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 {};
}
但我不知道是否可以从合并的注释中为内部注释设置一个值。