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这样的框架,使用它们是有意义的.
每个带注释的注释@Target(ElementType.ANNOTATION_TYPE)称为Meta-annotation。也就是说,您可以定义自己的自定义批注,将许多批注合并为一个批注以创建composed annotations。
Android世界的一个很好的例子是 StringDef
表示带注释的String元素表示逻辑类型,并且其值应为显式命名的常量之一。
Run Code Online (Sandbox Code Playgroud)@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";
代码检查器将以@ServicesName和@WeekDays相同的方式对待@StringDef。结果,我们可以根据需要创建尽可能多的named StringDef并覆盖常量集。@Target(ElementType.ANNOTATION_TYPE)它是一个允许扩展注释使用范围的工具。
| 归档时间: |
|
| 查看次数: |
47496 次 |
| 最近记录: |