我在使用多个注释时有一个问题,这些注释都或多或少地说了相同的东西,但是对不同的框架,我想将它们全部分组为一个自定义注释。目前看起来像这样:
@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;
您可以看到它们都重复相同的字符串,我想结合它们,但是我还没有找到一种方法。
是否可以做到这一点,还是我必须继续执行此操作或更改/创建一个新框架?
答案是:可能 no,这是不可能的(使用" standard" java(。
您看到,没有 sentaritance 注释,更不用说"多倍"可以让您表达的继承:
public @interface MultiAnnotiation extends Column, XmlElement, ...
而且很可能是这样的,这些注释是这样工作的:在 runtime 相应的框架使用反射来检查某个对象是否具有该注释。如果找不到"它"注释,什么都没有发生。
因此,您需要一种神奇的方法。将这些注释插入您的类文件。
沸腾到:当您写自己的编译器并在Java上发明某些东西时,您可以做这样的事情。
处理compiler-plugins随附的注释时,情况可能会有所不同(含义:在编译时处理的注释(。也许您可以编写自己的自定义注释,然后触发相同的编译时间操作。
长话短说:所有这些听起来有趣的,而是高级,很可能:不会产生强大的,值得生产的代码!
可以将一些注释合并到一个注释中。例如,弹簧在Springbootapplication-Notation中进行:
/**
* 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 {};
}
,但我不知道是否可以从合并的注释中为内部注释设置值。
您实际上可以做到这一点(至少我用于测试算盘(。
从这里检查文章:https://www.swtestacademy.com/how-to-merge-mertiple-annotations-in-java/
只需创建一个新的@interface
,包括您需要的注释。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@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")
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCoolAnnotation {
}