@Target(ElementType.ANNOTATION_TYPE)的工作原理

Gai*_*aim 52 java annotations

Java注释用注释标记@Target以声明可以由该注释修饰的可能连接点.价值观TYPE,FIELD,METHOD,等的ElementType枚举是明确的,简单易懂.

为什么@Target(ANNOTATION_TYPE)使用价值?带注释的注释有哪些优点?他们的贡献是什么?给我一个关于它如何工作以及为什么要使用它的想法解释.一些已经存在且众所周知的使用示例也很棒.

zag*_*gyi 36

您可以使用带注释的注释来创建元注释,例如@Transactional在Spring中考虑这种用法:

/**
 * Shortcut and more descriptive "alias" for {@code @Transactional(propagation = Propagation.MANDATORY)}.
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional(propagation = Propagation.MANDATORY)
public @interface RequiresExistingTransaction {
}
Run Code Online (Sandbox Code Playgroud)

当您启用Spring来处理@Transactional注释时,它将查找带有它的类和方法@Transactional 或它的任何元注释(带有注释的注释@Transactional).

无论如何,这只是一个如何使用带注释的注释的具体示例.我想这主要是像Spring这样的框架,使用它们是有意义的.

  • 更具体地说,关于“ANNOTATION_TYPE”的问题,“ANNOTATION_TYPE 目标表示Java 注释定义。因此,该注释只能用于注释其他注释。” 见 http://tutorials.jenkov.com/java/annotations.html (2认同)

yoA*_*ex5 5

每个带注释的注释@Target(ElementType.ANNOTATION_TYPE)称为Meta-annotation。也就是说,您可以定义自己的自定义批注,将许多批注合并为一个批注以创建composed annotations

Android世界的一个很好的例子是 StringDef

表示带注释的String元素表示逻辑类型,并且其值应为显式命名的常量之一。

@Retention(SOURCE)
@StringDef({POWER_SERVICE, WINDOW_SERVICE, LAYOUT_INFLATER_SERVICE}) 
public @interface ServicesName {}

public static final String POWER_SERVICE = "power";
public static final String WINDOW_SERVICE = "window";
public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
Run Code Online (Sandbox Code Playgroud)

代码检查器将以@ServicesName@WeekDays相同的方式对待@StringDef。结果,我们可以根据需要创建尽可能多的named StringDef并覆盖常量集。@Target(ElementType.ANNOTATION_TYPE)它是一个允许扩展注释使用范围的工具。