天天用注解,注解到底怎么起作用的?

本文探讨了Java注解的工作原理,揭示了注解并不包含业务逻辑,而是借助反射在类加载时检测方法或类上的注解并执行相应逻辑。通过一个自定义注解的例子,说明了注解如何与实现类关联,强调了注解的元数据角色,以及其在代码逻辑实现过程中的间接作用。
摘要由CSDN通过智能技术生成

用框架,天天和注解打交道,只知道加某个注解就实现了某个功能,但是注解是如何运转的也不知道,毕竟自定义注解很少用或没用过,学过注解的也只是知道它是通过反射来实现的,但是!但是!但是!看下面>>>>>>>>>>

  • 当我们在IDEA中点某个注解进去的时候发现,啥都没有,就那么点点代码,想想应该有个代码逻辑实现的过程才对呀

在这里插入图片描述

  • 我不信,继续点,点…点着点着到元注解了,反正就是看不到代码实现过程,就算是反射机制,那这个注解也是应该和哪个实现类挂钩呀,为什么找不到呢

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rx9G3vur-1662825136481)(../AppData/Roaming/Typora/typora-user-images/image-20220910233559571.png)]

  • 哦上网找了资料,先看看一个自定义注解的实现过程:
//自定义一个注解
@Retention(RetentionPolicy.RUNTIME)
public @interface MyJunit {

}

public class PrintNumber {
    public void showOdd(){  //打印奇数
        for (int i = 0; i < 10; i++) {
            if (i % 2!=0) {
                System.out.print(i+" ");
            }
        }
    }

    @MyJunit
    public void showEven(){ //打印偶数
        for (int i = 0; i < 10; i++) {
            if (i % 2==0) {
                System.out.print(i+" ");
            }
        }
    }
}

public class JunitTest {
    public static void main(String[] args) throws Exception {
        //1.创建PrintNumber对象
        PrintNumber printNumber = new PrintNumber();
        //2.获取该类的字节码文件对象
        Class<? extends PrintNumber> clazz = printNumber.getClass();
        //3.获取对象中的所有方法
        Method[] methods = clazz.getMethods();
        for (Method method:methods) {
            //4.判断方法上是否有@MyJunit注解
            boolean flag = method.isAnnotationPresent(MyJunit.class);
            //5.如果方法上有@MyJunit注解,则执行
            if (flag){
                method.invoke(printNumber);
            }
        }
    }
}

到这里终于明白了,注解确实不包含任何业务逻辑。

它利用反射机制在类加载的时候判断哪个方法或者类上使用了该注解,然后就调用相应的逻辑代码,也就是实现类进行功能的实现,所以我们才在注解中看不到任何的代码逻辑实现过程,这些代码逻辑实现过程应该是在另一个地方,我想应该是和注解在同一个包下,想要看实现过程需要自己去找,因为是通过反射机制的,所以在类加载的时候,JVM通过判断自己会去寻找这个实现类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值