文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在Java开发做了10年后,才学会此绝招,用于颠覆Java应用

2024-12-03 18:12

关注

本文转载自微信公众号「小明菜市场」,可以通过以下二维码关注。转载本文请联系小明菜市场公众号。

什么是反射

一般情况下,需要一个功能的前提是遇到了什么问题,先列举一些问题,再通过反射是如何解决这些问题。普通开发人员工作中最常遇到的问题是,需要生成代理对象。解决方法是:将需要加强的类,利用反射加载之后,与补充的逻辑进行融合,产生一个新的对象,这个对象就是代理对象,即具备原有的类以及新的逻辑的增强后的类。比如Man类里有个 eat 方法,我们希望执行eat方法之前和之后都需要执行洗手,洗碗,而又不能修改eat方法,这个时候就需要使用代理对象,在执行eat之前和之后执行这些操作。

应用场景

开发通用框架,反射最重要的用途就是开发各种通用框架,很多框架比如Spring,都是配置化的,为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象和类,调用不同的方法,这个时候就需要使用反射,在运行时动态的加载需要的对象。动态代理,在切面编程中,需要拦截特定的方法,通常会使用动态代理,动态代理需要使用反射技术来实现。注解:注解也是使用了反射机制,根据注解的标记来调用注解解释器,执行行为,如果没有反射机制,注解就会失效。可扩展功能,应用程序可以通过使用完全限定名称创建可扩展的对象实例。

反射和代理涉及的术语

真实对象:就是原始类实例化后产生的对象,未经过代理模式加强后的对象。代理对象:利用代理模式增强后的对象。动态代理类:代理对象逻辑处理器,即,增强的逻辑所处的位置,需要传入真实对象产生关联的动态代理对象。invocationHandler 接口:动态代理类需要实现这个接口,并且重写 invoke方法,增强的逻辑在 invoke 方法里,每个代理类的实例都关联到了一个 Handler,当我们调用代理对象的时候,会转发到invocationHandler接口的invoke方法进行调用。Proxy:代理类,用于动态代理对象传入之后,产生代理对象。

反射与代理关系

代理模式的主要作用产生代理对象从而实现增强后的方法,反射作为Java提供的特性,是实现代理模式的基础,即,利用反射技术获取和操作Java程序里的类,从而对这些类进行包装盒加工,产生代理对象。获取代理对象:第一步:调用 Proxy.newProxyInstance 获得一个动态代理对象,其接收三个参数,上个参数分别是

  1. ClassLoader 对象,定义哪个ClassLoader对象进行生成代理对象进行加载
  2. 一个 Interface 对象数组,表示我们需要给代理对象提供什么接口,如果给其提供一组接口,那么这个代理对象就利用了多态实现了该接口。通过多态就实现调用这组接口中的方法。3.一个InvocationHandler的实现类对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个invocationHandler的实现类对象上。第二步: 获得代理对象的类对象 第三步: 获得代理类的所有方法 第四步:通过代理对象调用实现类的方法,触发我们的重点步骤,invocationHandler 接口的实现类的invoked方法,从而执行实现类的方法。第五步:调用invocationHandler 接口 传入了三个参数,这三个参数分别为:
  3. proxy 指代我们所代理的那个真是对象。
  4. method 我们需要调用的方法
  5. args 需要传入的参数

jdk 动态代理和CGLIB动态代理的区别

代理方式:通过继承真实对象的类或者实现其所需要实现的接口,把增强的逻辑补充进去完成。jdk动态代理是通过实现接口完成,当一个类是通过实现接口产生,就是jdk动态代理。CGLIB动态代理通过继承类完成,当一个类没有实现接口,只能使用jdk动态代理。

Reflection框架

Java里提供了反射获取类的各个属性和方法的类,需要拿到类才能进行相应的操作,但是反射框架,Reflections 不但能获取classpath下的类,还能根据特定的注解获取。Reflections 通过扫描classpath,索引元数据,并且允许在允许时查询元数据。使用Reflections可以很轻松的获取下面的元数据

  1. 某个类型的全部子类
  2. 只要类型,构造器,方法,字段上带有特定的注解,便能获取带有这个注解的全部信息。
  3. 获取所有匹配某个正则表达式的资源
  4. 获取带有特定签名的方法,包括参数,参数注解,返回类型。
  5. 获取方法的名字,
  6. 获取代理里所有的字段,方法名,构造器的使用

关于作者

我是小小,一个生于二线,活在一线的城市的程序猿,我是小小,我们下期再见。

 

来源:小明菜市场 内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯