1. 概述
- 注解也叫元数据,它是一种代码级别的说明。
- 注解使用方式:@注解名
- 注解和注释不同。注释是只是给人看的,它不参与到程序。而注解既是给人看的,也是给程序看的,它要参与到程序。
- 注解可以通过反射机制被访问。
2. 三种内置注解
-
在Java中有三种内置的注解:@Override、@Deprecated和@SuppressWarnings
- @Override 重写的注解,表示该方法为重写方法
- @Deprecated 方法废弃的注解,表示该方法已经过时或存在问题,不推荐程序员使用
- @SuppressWarnings 抑制编译器警告的注解,其需要至少一个表示要抑制的警告的值
// 三种内置注解 public class AnnotationDemo01 { // @Override 重写的注解,表示该方法为重写方法 @Override public String toString() { return "被重写了~~~"; } // @Deprecated 方法废弃的注解,表示该方法已经过时或存在问题,不推荐程序员使用 @Deprecated public void testDeprecated() { System.out.println("该方法已经被废弃~~~"); } // @SuppressWarnings 抑制编译器警告的注解,其需要至少一个表示要抑制的警告的值 @SuppressWarnings("unused") public void testSuppressWarnings() { Object o = new Object(); // 加上@SuppressWarnings注解后,编译器不会提示对象未使用 } public static void main(String[] args) { AnnotationDemo01 annotationDemo01 = new AnnotationDemo01(); System.out.println(annotationDemo01.toString()); annotationDemo01.testDeprecated(); // 方法仍然可以调用,但调用时会在方法上显示横线划去 /* 结果: 被重写了~~~ 该方法已经被废弃~~~ */ } }
3. 四种元注解和自定义注解
-
元注解是负责注解其他注解的注解,Java中定义了@Target、@Retention、@Documented和@Inherited四种
- @Target():描述注解的使用范围,范围取决于括号内的值,一般的值有:ElementType.TYPE(类、接口、枚举)、ElementType.METHOD(方法)、ElementType.FIELD(属性)…
- @Retention():描述注解的生命周期,生命周期取决于括号内的值,该值有三个:RetentionPolicy.SOURCE、RetentionPolicy.CLASS和RetentionPolicy.RUNTIME,一般值取RetentionPolicy.RUNTIME(生命周期:RUNTIME>CLASS>SOURCE)
- @Documented:表示注解将被包含在JavaDoc文档中
- @Inherited :表示子类可以继承父类的该注解
-
通过元注解可以自定义注解,自定义注解的格式:public @interface 注解名 { 类型 参数名();… }
-
自定义注解可以定义的类型只能为:基本数据类型,枚举类型,Class,String
-
自定义注解中的参数可以使用default来声明参数的默认值,一般为空字符串、0
-
自定义注解如果只有一个参数,一般参数名为value(参数名为value时,使用注解可以将“@注解名(value = 值)”简化为“@注解名(值)”)
import java.lang.annotation.*; // 四种元注解 用于注解其他注解的注解 @Target(ElementType.TYPE) // 描述注解的使用范围,范围取决于括号内的值 @Retention(RetentionPolicy.RUNTIME) // 描述注解的生命周期,生命周期取决于括号内的值 @Documented // 表示注解将被包含在JavaDoc文档中 @Inherited // 表示子类可以继承父类的该注解 public @interface AnnotationDemo02 { // 自定义值 String value(); // 字符串 String name() default ""; // 带默认值的字符串 int age() default 0; // 带默认值的基本数据类型int double[] array(); // 基本数据类型double Class aClass(); // Class类型 TestEnum aEnum(); // 枚举类型 } enum TestEnum { RED, BLUE, GREEN }