Java反射使用

以下纯属于个人理解
在日常开发,很少使用反射,但是反射是Java基础重要特性之一,而且有很多写反射使用案例,我就不多说,说一下,我会在什么情况下使用反射,如何利用好这一特性。

  1. 动态加载的代码。适合使用反射。
  2. 在无法直接调用方法,使用反射。
  3. 利用反射进行对象的修改

1 动态加载的代码,适合用反射。
为什么说动态加载的代码适合用反射,可以明显的知道,代码物理隔离,内存未隔离,如你用A工程 调用 B工程的某个类。就会涉及classloader。内存中的地址问题。在java中不属于同一个classloader,就会存在调用不存在问题。
看图说话把,如下
在这里插入图片描述
ucp是绑定的磁盘位置。也就是对应的文件路径,在关闭的时候会释放一下ucp。
这算是重写classloader的注意事项之一,顺便提一下,因为吃过一次亏。因为ucp没有释放,导致磁盘文件一直被占用,无法删除的问题。
在这里插入图片描述
然后就是classes该类加载器加载的类。至于为什么,如下图。看源码和注释的简介,很明确,也不需要多的解释。我这里是新new URLclassloader所以自己的classes为空,我看的parent。java是双亲委派机制,所以我看一下父类的就可以了。而且我目前知道一个新的classLoader无法读取相符依赖的类的注解,原因还没有详细详细研究倒是。所以动态加载的代码,你就算写一个A项目 C类 实现,实际应用中调用B项目的 C类 就会存在一定的问题,因此 我建议使用反射,虽然麻烦点,可以规避一些问题。而且该类问题特难排查

在这里插入图片描述
在这里插入图片描述

2 无法直接调用的方法使用反射
因为无法直接调用,无外乎外部加载和权限不够的使用的情况,外部加载如上述原因,和权限不够,可以使用暴力反射和unsafe(unsafe尽量别用,用不好比反射还坑),虽然暴力反射坑了点,使用完毕后还原权限,还是能使用的。
注意:暴力反射使用后,还原权限!!
不然真会出安全性问题,而且很高。所以在权限不足的时候,你最好还是看看他为什么私有化。能否将相关代码提出来,
如果能提取出来,还是提出来把,避免出了bug,他改了方法,然后你的功能出了bug,这种情况,我相信各位遇到过。
所以除非公共方法,其他人写的代码,尽量重写。不建议使用暴力反射,必须使用,请在使用后还原。请把还原权限在写在finally,避免不必要麻烦

3 对对象的修改
其实就是unsafe,我就不多了,有兴趣自己去了解一下。

还有根据反射寻找实现等使用,就不是我们这些码农使用的了,看看springboot代码,就好,面试的时候提一嘴就行,这个你实际使用基本遇不到问题,除非重写一些spring的代码,如果真有这样的,这文章你就白看了,没什么用的。

说一个我遇到的问题把,在反射中,我要使用A,B两个项目,A项目通过动态加载B项目,然后在A项目通过反射调B的方法,但是B里面有个A类,有个A接口实现的B类,A类有个方法,参数A接口,但实际使用我只能通过反射获取到A类的实现B类,所以我如何通过B类寻找A类的该方法。
当然不可以全部方法获取,然后通过便利去实现。所以我在想通过B类的class获取接口class,然后获取接口的class,然后在获取方法,但是如果存在多个接口,怎么办,所以我一直没找到好的方法,如果知道好方法,可以说一下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值