注解(Annotation):属于引用数据类型,是代码里的特殊标记, 程序可以读取注解,一般用于替代配置文件。
开发人员可以通过注解告诉类如何运行。
代码演示:
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:
解决方法:
MyAnnotation:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
//属性
String name() default "张三";
int age() default 19;
Gender gender() default Gender.MALE;
}
元注解:用来描述注解的注解。
@Retention:用于指定注解可以保留的域。
@Target:指定注解用于修饰类的哪个成员。
代码演示:
@Target(ElementType.METHOD)//只能用于方法上
@Retention(RetentionPolicy.SOURCE)//编译时直接丢弃这种策略的注释
public @interface Override {
}
注解属性类型:
注解的本质: 接口;
代码反编译:
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();
}