Java – @Target 注解
Java中的注解用于将元数据与类、方法、实例变量等程序元素相关联Java中主要有三种类型的注解:标记注解(没有任何方法)、单值注解(只有一个方法)、和多值注释(使用不止一种方法)。 @Target 注解是一种元注解,即只能用于注解其他注解。它将 ElementType 枚举作为其唯一参数。 ElementType 枚举是一个常量,它指定可以应用注解的程序元素声明(类、接口、构造函数等)的类型。如果我们将带有某些 ElementType 的 @Target 注释作为注释应用到自定义注释名称 CustomAnnotation 上,那么 @CustomAnnotation 只能用于注释那些特定的元素类型,否则会出错。
下表显示了元素类型,可以注释的元素声明如下:Element Type Element to be Annotated Type Class, interface or enumeration Field Field Method Method Constructor Constructor Local_Variable Local variable Annotation_Type Annotation Type Package PACKAGE Type_Parameter Type 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")