@Target(ElementType.ANNOTATION_TYPE) 如何工作

新手上路,请多包涵

Java 注释标有 @Target 注释以声明可以由该注释修饰的可能连接点。 Values TYPE , FIELD , METHOD , etc. of the ElementType enum are clear and simply understandable.

问题

为什么 要使用 @Target(ANNOTATION_TYPE) 值?带注释的注解有什么用?他们的贡献是什么?给我一个 想法的解释,它是如何工作的,为什么我应该使用它。一些已经存在且众所周知的使用示例也很棒。

原文由 Gaim 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 651
2 个回答

您可以使用带注释的注释来创建元注释,例如考虑 @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 {
}

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

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

原文由 zagyi 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

代码检查器将处理 @ServicesName 和 --- 与 --- @StringDef @WeekDays 相同。因此,我们可以根据需要创建尽可能多的 命名 StringDef 并覆盖常量集。 @Target(ElementType.ANNOTATION_TYPE) 它是一个允许扩展注释使用的工具。

原文由 yoAlex5 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题