📜  Java – @Targeted 注释

📅  最后修改于: 2022-05-13 01:55:08.983000             🧑  作者: Mango

Java – @Targeted 注释

在Java注解用于关联元数据以程序元素,如类,方法,实例变量等主要有三种类型的Java注释:标记注释(没有任何方法),单值注释(具有一个单一的方法),和多值注释(使用不止一种方法)。 @Target 注解是元注解,即只能用来注解其他注解。它采用 ElementType 枚举作为其唯一参数。 ElementType 枚举是一个常量,它指定可以应用注释的程序元素声明(类、接口、构造函数等)的类型。如果我们将带有某些 ElementType 的 @Target 注释应用为自定义注释名称 CustomAnnotation 的注释,那么 @CustomAnnotation 只能用于注释那些特定的元素类型,否则我们将得到一个错误。

下表列出了元素类型,可注解的元素声明如下:

Element Type Element to be Annotated 
Type Class, interface or enumeration
Field Field
Method Method 
ConstructorConstructor
Local_Variable Local variable 
Annotation_Type Annotation Type 
Package PACKAGE
Type_ParameterType Parameter 
Parameter Formal Parameter 

为了使用@Target 注解,请遵循以下语法:

句法:

@Target(ElementType.TYPE)
@interface CustomAnnotation {}

在上面提到的代码示例中,我们创建了一个使用@Target 注解进行注解的自定义注解。由于我们使用了 ElementType 作为 TYPE,因此,自定义注解只能注解一个类、枚举或接口。我们还可以创建一个自定义注释,该注释可以应用于多个元素,方法是将大括号分隔的元素类型列表作为 @Target 注释的参数,如下所示。



句法:

@Target({ElementType.METHOD, ElementType.PACKAGE})
@interface CustomAnnotation {}

上面创建的自定义注解可用于注解方法或包。下面提到的代码展示了我们如何使用@Target 注解。我们创建了两种自定义注释:一种可以应用于单一元素类型,一种可以应用于多种元素类型。然后我们将这些注释应用到我们的类和方法中,最后,我们通过获取它们来打印这些注释。

执行:

例子

Java
// Java program to Illustrate Targeted Annotations
 
// Importing required classes from java.lang package 
import java.lang.annotation.*;
 
// Creating a custom annotation with target
// as TYPE which means it can annotate a class,
// enumeration, or interface
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
 
// Class Annotation
@interface ClassAnnotation
{
    String value() default "Can annotate a class";
}
 
// Creating custom annotation with
// target as multiple Element types as parameters
// which means it can annotate various Elements
@Target({ ElementType.METHOD, ElementType.TYPE,
          ElementType.ANNOTATION_TYPE,
          ElementType.CONSTRUCTOR })
@Retention(RetentionPolicy.RUNTIME)
@interface MultipleElementTypeAnnotation
{
 
    String value() default "Can annotate a class, method, "
        + "annotation, or constructor";
}
 
// Class to demonstrate the use of custom
// created annotations
@ClassAnnotation
 
// Main class
// TargetAnnotationDemo
public class GFG {
 
    @MultipleElementTypeAnnotation public void myMethod() {}
 
    // Main drive method
    public static void main(String[] args) throws Exception
    {
        GFG obj = new GFG();
 
        // Accessing the annotations used to annotate the
        // class and storing them in an array of Annotation
        // type since only one annotation is used to
        // annotate our class therefore we print a[0]
        Annotation a[] = obj.getClass().getAnnotations();
 
        System.out.println(a[0]);
 
        // Accessing the annotations used to annotate the
        // method and storing them in an array of Annotation
        // type
        Class className = Class.forName("GFG");
        Annotation b[] = className.getMethod("myMethod")
                             .getAnnotations();
 
        System.out.println(b[0]);
    }
}


输出
@ClassAnnotation(value="Can annotate a class")
@MultipleElementTypeAnnotation(value="Can annotate a class, method, annotation, or constructor")