注解
一、概述
1.作用
让其他程序根据注解信息知道怎么运行该程序。
2.自定义注解
public @Interface 注解名{
public 属性类型 属性名() default 默认值;
}
3.使用注解
@Test(value = "xxx", name = "xxx")
如果注解只有一个属性value(或其他注解都有默认值),则可以不用注明这个属性
@Test("xxx")
4.注解原理
- 注解本质是一个接口,继承了Annotation接口,其属性都是抽象方法
- @注解(…)本质是一个实现类对象
二、元注解
1.作用
修饰注解的注解
2.常见元注解
-
@Target:声明被修饰的注解能在哪些地方使用
@Target(ElementType.TYPE, ElementType.FIELD)
- TYPE:类,接口
- FIELD:成员变量
- METHOD:成员方法
- PARAMETER:方法参数
- CONSTRUCTOR:构造器
- LOCAL_VARIABLE:局部变量
-
@Retention:声明注解的保留周期
@Retention(RetentionPolicy.RUNTIME)
- SOURCE:只用于源码阶段,字节码文件不存在
- CLASS(默认):保留字节码文件,运行时不存在
- RUNTIME(常用):保留到运行阶段
三、注解的解析
1.定义
判断是否存在注解并把注解的内容解析出来
2.如何解析
-
Class、Method、Field、Constructor都实现了AnnotatedElement接口,拥有解析注解的能力
Annotation[] getDeclaredAnnotations(); //获取当前对象的注解 T getDeclaredAnnotation(Class<T> annotationClass) //获取指定的注解对象 boolean isAnnotationPresent(Class<Annotation> annotationClass) //判断当前对象是否存在某个注解
3.应用
自定义测试注解
public class AnnotationTest {
@MyTest
public void test1(){
System.out.println("Test1");
}
@MyTest
public void test2(){
System.out.println("Test2");
}
//@MyTest
public void test3(){
System.out.println("Test3");
}
public static void main(String[] args) {
AnnotationTest annotationTest = new AnnotationTest();
//测试启动程序
Class c = AnnotationTest.class;
Method[] methods = c.getDeclaredMethods();
for(Method method : methods){
if(method.isAnnotationPresent(MyTest.class)){
try {
//实例方法需要一个对象来调用
method.invoke(annotationTest);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}