【问题标题】:What do Java annotation ElementType constants mean?Java注解ElementType常量是什么意思?
【发布时间】:2011-04-02 19:01:37
【问题描述】:

java.lang.annotation.ElementType:

一种程序元素类型。这种枚举类型的常量提供了 Java 程序中声明元素的简单分类。这些常量与Target 元注释类型一起使用,以指定使用注释类型的合法位置。

有以下常量:

  • ANNOTATION_TYPE - 注释类型声明
  • CONSTRUCTOR - 构造函数声明
  • FIELD - 字段声明(包括枚举常量)
  • LOCAL_VARIABLE - 局部变量声明
  • METHOD - 方法声明
  • PACKAGE - 包声明
  • PARAMETER - 参数声明
  • TYPE - 类、接口(包括注解类型)或枚举声明

有人能解释一下它们各自是什么吗(在实际代码中它们会被注释的地方)吗?

【问题讨论】:

  • 描述还不够清楚吗?您肯定至少了解其中的一些吗?
  • @meriton: 我只见过字段、方法和类的注解,大概对应FIELDMETHOD类型。我将发布每个注释的示例,也许有人会填写其余部分?
  • Java 8 添加了两个新常量,TYPE_PARAMETER 和 TYPE_USE。

标签: java annotations


【解决方案1】:

假设您指定ElementType 的注释称为YourAnnotation

  • ANNOTATION_TYPE - 注释类型声明。 注意:这适用于其他注释

    @YourAnnotation
    public @interface AnotherAnnotation {..}
    
  • CONSTRUCTOR - 构造函数声明

    public class SomeClass {
        @YourAnnotation
        public SomeClass() {..}
    }
    
  • FIELD - 字段声明(包括枚举常量)

    @YourAnnotation
    private String someField;
    
  • LOCAL_VARIABLE - 局部变量声明。 注意:这不能在运行时读取,所以它只用于编译时的东西,比如@SuppressWarnings注解。

    public void someMethod() {
        @YourAnnotation int a = 0;
    }
    
  • METHOD - 方法声明

    @YourAnnotation
    public void someMethod() {..}
    
  • PACKAGE - 包声明。 注意:这只能用于package-info.java

    @YourAnnotation
    package org.yourcompany.somepackage;
    
  • PARAMETER - 参数声明

    public void someMethod(@YourAnnotation param) {..}
    
  • TYPE - 类、接口(包括注解类型)或枚举声明

    @YourAnnotation
    public class SomeClass {..}
    

您可以为给定的注解指定多个ElementTypes。例如:

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})

【讨论】:

  • @Bozho: 感谢专业提示。我在投票计数器下方勾选了标记。
【解决方案2】:

总结了主要的:

@CustomTypeAnnotation
public class MyAnnotatedClass {
  @CustomFieldAnnotation
  private String foo;

  @CustomConstructorAnnotation
  public MyAnnotatedClass() {
  }

  @CustomMethodAnnotation
  public String bar(@CustomParameterAnnotation String str) {
    @CustomLocalVariableAnnotation String asdf = "asdf";
    return asdf + str;
  }
}

ANNOTATION_TYPE 是另一个注解上的注解,像这样:

@CustomAnnotationTypeAnnotation
public @interface SomeAnnotation {
  ..
}

包在包中的package-info.java文件中定义,如下所示:

@CustomPackageLevelAnnotation
package com.some.package;

import com.some.package.annotation.PackageLevelAnnotation;

有关 PACKAGE 注释的更多信息,请参阅 herehere

【讨论】:

  • 如果您还为 ANNOTATION_TYPE 和 PACKAGE 包含 sn-ps,答案会更好。
  • @JohnGlassmyer - 晚了几年,但我为 ANNOTATION_TYPE 和 PACKAGE 添加了更多 sn-ps。 :-)
【解决方案3】:

类型

注释:

@Target({ElementType.TYPE})    // This annotation can only be applied to
public @interface Tweezable {  // class, interface, or enum declarations.
}

以及一个示例用法:

@Tweezable
public class Hair {
    ...
}

【讨论】:

    【解决方案4】:

    TYPE 和 ANNOTATION_TYPE 实际应用的一个很好的例子是a custom cross-field validation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多