Java注解的本质

概述
  • 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);
            	}
            }
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值