Java 语言中存在三类注解,分别是元注解(Meta-annotations)、Java 内置注解(Built-in Annotations)和自定义注解(Custom Annotations)。
1、元注解(Meta-annotations)
元注解是指用于注解其他注解的注解。Java 语言中内置了数个元注解,包括@Retention、@Target、@Inherited、@Documented、@Repeatable 等。通常情况下,创建新注解时,也会使用到这些元注解来描述新注解。
下面是一些元注解的含义和示例:
- @Retention:用于描述注解的保留策略,即注解信息在运行时是否还保留在类文件中。示例代码:@Retention(RetentionPolicy.RUNTIME)。
- @Target:用于指定注解可以应用的目标类型(类、方法、属性等),可以出现在注解声明的自定义注解上。示例代码:@Target(ElementType.METHOD)。
- @Inherited:用于指定子类是否自动继承父类上的注解。示例代码:@Inherited。
- @Documented:用于指定注解是否包含在 JavaDoc 中。示例代码:@Documented。
2、Java 内置注解(Built-in Annotations)
Java 内置注解是指 Java 标准库中所提供的一些注解,它们在 Java 应用程序开发中有广泛的应用,如 @SuppressWarnings、@Override 等。Java 内置注解的使用方式和普通注解类似。
下面是一些 Java 内置注解的示例:
- @Override:表示当前方法将覆盖其父类中的同名方法。示例代码:@Override。
- @SuppressWarnings:表示取消编译器或 IDE 的警告信息。示例代码:@SuppressWarnings(“unchecked”)。
- @Deprecated:表示已经不建议使用的程序元素。示例代码:@Deprecated。
3、自定义注解(Custom Annotations)
自定义注解是指开发者自己创建的一些注解,用于添加程序元素的元数据信息。自定义注解是 Java 应用程序开发中的一项重要机制,例如 Spring MVC 中的@RequestMapping、@RequestBody、@Autowired 等,都是自定义注解。
下面是一个自定义注解的示例:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String name() default "MyAnnotation";
String value() default "";
}
上述代码中,我们创建了一个名为 @MyAnnotation 的自定义注解,该注解包含两个元素:name 和 value。其中,name 元素是必填项,它指定了注解的名称;value 元素是选填项,用于设置注解的具体值。
总之,注解是一种非常强大和灵活的 Java 语言机制,它可以为 Java 应用程序添加更多丰富的元数据信息,方便开发者在程序运行时进行元数据的读取和处理,提高程序的可读性和可维护性。
@Target(ElementType.TYPE) 是用于指定注解所能应用到程序元素的种类,其中的 ElementType.TYPE
表示注解可以应用到类、接口(包括注解类型)或枚举上。
具体而言,该注解可以用于标注类、接口、枚举以及注解类型声明上,也就是说,在编写注解时,我们可以通过这个注解指定这个注解可以用于哪些类、接口、枚举或注解类型上。
下面是一个示例,演示如何使用 @Target(ElementType.TYPE) 声明一个自定义注解 @MyAnnotation,以便将该注解应用在类、接口、枚举和注解类型上:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "";
}
在上述代码中,我们使用注解@Target(ElementType.TYPE)来指定该注解可以应用于类、接口、枚举和注解类型上。这意味着,如果一个类上使用了该注解,则这个注解同样可以应用于该类的所有子类以及实现的接口、枚举和注解类型上。