一:了解
1.就是Java代码里的特殊标记,比如:@Override、@Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序。
2.注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处。
二:自定义注解
就是自己定义注解。
public @interface MyTest1 {
String aaa();
boolean bbb() default true;
String[] ccc();
}
特殊属性名:value
如果注解中只有一个value属性,使用注解时,value名称可以不写!
public @interface MyTest1 {
String value();
}
@MyTest1("王凯")
三:注解的原理
1.注解本质是一个接口,Java中所有注解都是继承了Annotation接口的。
2.@注解(...):其实就是一个实现类的对象,实现了该注解以及Annotation接口。1
四:元注解
1.指的是:修饰注解的注解
2.@Target
作用:声明被修饰的注解只能在哪些位置使用
@Target(ElementType.TYPE)
①TYPE 类,接口
②FIELD 成员变量
③METHOD 成员方法
④PARAMETER 方法参数
⑤CONSTRUCTOR 构造器
⑥LOCAL_VARIABLE 局部变量
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.TYPE,ElementType.ANNOTATION_TYPE})
public @interface MyTest1 {
String value();
}
3.@Retention
作用:声明注解的保留周期
@Retention(RetentionPolicy.RUNTIME)
①SOURCE 只作用在源码阶段,字节码文件中不存在
②CLASS(默认值) 保留到字节码文件阶段,运行阶段不存在
③RUNTIME(开发常用) 一直保留到运行阶段
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest1 {
String value();
}
五:注解的解析
1.什么是注解的解析?
就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容解析出来。
2.如何解析注解?
①指导思想:要解析谁上面的注解,就应该先拿到谁。
②比如要解析类上面的注解,则应该先获取类的Class对象,再通过Class对象解析其上面的注解。
③比如要解析成员方法上的注解,则应该获取到该成员方法的Methond对象,再通过Methond对象解析其上面的注解。
④Class、Methond、Fileld、Constructor、都实现了AnnotatedElement接口,它们都拥有解析注解的能力。
3.AnnotatedElement接口提供了解析注解的方法
getDeclaredAnnotations() 获取当前对象上面的注解
getDeclaredAnnotation(Class<T> annotationClass) 获取指定的注解对象
isAnnotationPresent(Class<Annotation> annotationClass) 判断当前对象上是否存在某个注解
4.示例:
import java.lang.reflect.Method;
import java.util.Arrays;
public class AnnotationTest2 {
public static void main(String[] args) throws Exception {
parseClass();
}
public static void parseClass() throws Exception {
Class c = Demo.class;
Method m = c.getDeclaredMethod("test1");
if (m.isAnnotationPresent(MyTest2.class)){
MyTest2 myTest2 = (MyTest2) m.getDeclaredAnnotation(MyTest2.class);
System.out.println(myTest2.aaa());
System.out.println(myTest2.value());
System.out.println(Arrays.toString(myTest2.bbb()));
}
}
}