Java - 注解
1 什么是注解?
注解(Annotation):属于引用数据类型,是代码里的特殊标记, 程序可以读取注解,一般用于替代配置文件。
2 注意事项
- 使用@interface关键字定义。
- 注解中只能包含公开的属性,使用default关键字赋值默认值。
- 如果属性名是value,赋值时可以省略属性名。
开发人员可以通过注解告诉类如何运行。
- 注解的典型应用是:可以通过反射技术去得到类里面的注解,以决定怎么去运行类。
代码演示:
MyAnnotation:
public @interface MyAnnotation {
//属性
String name() default "张三";
int age() default 19;
Gender gender() default Gender.MALE;
}
Person:
public class Person {
//有默认值时可以省略, 也可以覆盖
//当属性名为 value 时, 赋值可省略属性名
@MyAnnotation(name = "李四", age = 10, gender = Gender.FEMALE)
public void show() throws NoSuchMethodException {
//读取注解, 使用反射读取注解
//1 获取类对象
Class<?> personClass = Person.class;
//2 获取show方法
Method show = personClass.getMethod("show");
//3 获取注解
MyAnnotation annotation = show.getAnnotation(MyAnnotation .class);
System.out.println(
annotation.name()+"..."+annotation.age()+"..."+annotation.gender()
);
}
}
Test:
public class Test {
public static void main(String[] args) throws Exception{
Person person = new Person();
person.show();
}
}
报错:
Exception in thread “main” java.lang.NullPointerException
at StageOne.day25.demo1.TestAnnotation.Person.show(Person.java:25)
at StageOne.day25.demo1.TestAnnotation.Test.main(Test.java:12)
Person:
- Annotation ‘MyAnnotation .class’ is not retained for reflective access
- 注释’MyAnnoation. class’不保留用于反射访问
解决方法:
- 添加元注解, 指定注解可以保留的域
MyAnnotation:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
//属性
String name() default "张三";
int age() default 19;
Gender gender() default Gender.MALE;
}
3 元注解
元注解:用来描述注解的注解。
3.1 常有元注解
@Retention:用于指定注解可以保留的域。
- RetentionPolicy.CLASS:(只在字节码层面)
- 注解记录在class文件中,运行Java程序时, JVM不会保留,此为默认值。
- RetentionPolicy.RUNTIME:(不仅再字节码层面, 运行时也保留)
- 注解记录在 class文件中,运行Java程序时,JVM会保留,程序可以通过反射获取该注释。
-
RetentionPolicy.SOURCE:
@Target:指定注解用于修饰类的哪个成员。
代码演示:
@Target(ElementType.METHOD)//只能用于方法上
@Retention(RetentionPolicy.SOURCE)//编译时直接丢弃这种策略的注释
public @interface Override {
}
4 注解的属性
注解属性类型:
- String类型
- 基本数据类型
- Class类型
- 枚举类型
- 注解类型
- 以及以上类型的一维数组
5 注解的本质
注解的本质: 接口;
- 属性其实就是抽象方法。
代码反编译:
import StageOne.day25.demo1.TestEnum.Gender;
import java.lang.annotation.Annotation;
public interface MyAnnotation
extends Annotation
{
public abstract String name();
public abstract int age();
public abstract Gender gender();
}