Java注释ElementType常量是什么意思?

时间:2010-08-23 18:00:39

标签: java annotations

java.lang.annotation.ElementType

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

有以下常量:

  • ANNOTATION_TYPE - 注释类型声明
  • CONSTRUCTOR - 构造函数声明
  • FIELD - 字段声明(包括枚举常量)
  • LOCAL_VARIABLE - 本地变量声明
  • 方法 - 方法声明
  • PACKAGE - 套餐声明
  • PARAMETER - 参数声明
  • TYPE - 类,接口(包括注释类型)或枚举声明

有人可以解释每一个是什么(在实际代码中注释它们的位置)吗?

4 个答案:

答案 0 :(得分:90)

假设您指定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;
    }
    
  • 方法 - 方法声明

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

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

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

    @YourAnnotation
    public class SomeClass {..}
    

您可以为给定的注释指定多个ElementType。 E.g:

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

答案 1 :(得分:46)

总结了主要内容:

@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

答案 2 :(得分:3)

<强> TYPE

注释:

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

以及示例用法:

@Tweezable
public class Hair {
    ...
}

答案 3 :(得分:0)

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