概述
-
Java注解是代码中的特殊标记,比如@Override、@Test等,作用是让其他程序根据注解信息决定怎么执行该程序。
-
定义注解本质上是定义接口,每一个注解接口都继承Annotation接口;注解中的属性本质上是抽象方法;使用注解本质上就是实现接口,属性值可以通过调用抽象方法得到
-
public @interface MyTest{ String value(); //每个注解都有的特殊属性,在使用时可省略 int age() default 10;//指定默认值,相当于抽象方法,返回值是int,默认值是10 }
-
//反编译 public interface Mytest extend Annotation{ public abstract String value(); public abstract int age(); }
-
元注解
- 元注解是修饰注解的注解
- @Target是用来声明注解只能用在那些位置,比如:类上、方法上、成员变量上等(在ElementType这个枚举中)
- @Retetion是用来声明注解保留周期,比如:源代码时期、字节码时期、运行时期(在RetentionPolicy这个枚举中)
- 我们在自定义注解时要加上这两个注解指定注解的应用范围
解析注解
- 我们可以通过反射技术把类上、方法上、变量上的注解对象获取出来,然后通过调用方法就可以获取注解上的属性值了,结合我们自己的业务判断即可控制代码执行逻辑
- 注解在谁身上,就先获取谁,再用谁获取谁身上的注解
注解应用
-
注解是用来写框架的,比如现在我们要模拟Junit写一个测试框架,要求有@MyTest注解的方法可以被框架执行,没有@MyTest注解的方法不能被框架执行。
-
public class AnnotationTest4{ @MyTest public void test1(){ System.out.println("=====test1===="); } @MyTest public void test2(){ System.out.println("=====test2===="); } public void test3(){ System.out.println("=====test2===="); } public static void main(String[] args){ AnnotationTest4 a = new AnnotationTest4(); //1.先获取Class对象 Class c = AnnotationTest4.class; //2.解析AnnotationTest4类中所有的方法对象 Method[] methods = c.getDeclaredMethods(); for(Method m: methods){ //3.判断方法上是否有MyTest注解,有就执行该方法 if(m.isAnnotationPresent(MyTest.class)){ m.invoke(a); } } } }