当前位置:首页 > CN2资讯 > 正文内容

反射&代理反射代理

2天前CN2资讯

一 反射 是众多框架功能实现得核心机制,如:Spring中的注解MyBatis 中的Dao的方法到到XML中Sql的执行
Class对象获取的四种方式:
1 TargetObject.class 已知具体类
2 Class.forName("cn.con.TargetObject") 一直类的具体路径
3 instance.getClass() 已知对象的实例
4 ClassLoader.loadClass("cn.com.TargetObject") 使用类加载器通过类的路径获取,值得注意的是:类加载器获取的Class对象不会初始化,
也就是说初始化时一些列步骤和对象的静态代码块和静态对象都不会执行,思想类似于懒加载,推荐。

二 静态代理
1 使用较少不推荐,因为:静态代理需要手动增强代理对象中的每个方法,代理对象做修改,对应的代理类也需要手动修改,非常不灵活
2 静态代理的实现原理
1)创建一个接口和实现类
2)创建一个代理类也实现这个接口
3)在代理中中注入这个实现类,在代理类对应实现类的同名方法中调用实现类中的方法
3 在JVM 层面来说, 静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的 class 文件

三 动态代理
1 相比于静态代理来说,动态代理更加灵活。我们不需要针对每个目标类都单独创建一个代理类,并且也不需要我们必须实现接口,
我们可以直接代理实现类( CGLIB 动态代理机制)。
2 从 JVM 角度来说,动态代理是在运行时动态生成类字节码,并加载到 JVM 中的。
3 Spring AOP、RPC 框架的实现都依赖了动态代理
4 就 Java 来说,动态代理的实现方式有很多种,比如 JDK 动态代理、CGLIB 动态代理
4.1 JDK 动态代理机制
4.1.1 jdk动态代理必须实现接口
4.1.2 原理:
1)创建一个类实现InvocationHandler接口,重写invoke方法,在invoke方法中添加增强的逻辑
2)动态生成代理对象,而不需要像静态代理中一样手动去写
Proxy.newProxyInstance(
target.getClass().getClassLoader(), // 目标类的类加载
target.getClass().getInterfaces(), // 代理需要实现的接口,可指定多个
new DebugInvocationHandler(target) // 代理对象对应的自定义 InvocationHandler
)
4.2 CGLIB 动态代理
4.2.1JDK 动态代理有一个最致命的问题是其只能代理实现了接口的类。为了解决这个问题,我们可以用 CGLIB 动态代理机制来避免。
4.2.2 CGLIB 通过继承方式实现代理
4.3.3 原理:
DebugMethodInterceptor implements MethodInterceptor,实现MethodInterceptor接口重写intercept方法,编写额外逻辑
public class CglibProxyFactory {
public static Object getProxy(Class<?> clazz) {
// 创建动态代理增强类
Enhancer enhancer = new Enhancer();
// 设置类加载器
enhancer.setClassLoader(clazz.getClassLoader());
// 设置被代理类
enhancer.setSuperclass(clazz);
// 设置方法拦截器
enhancer.setCallback(new DebugMethodInterceptor());
// 创建代理类
return enhancer.create();
}
}


四 总结
1 代理的好处:可以在不修改原有对象的基础上,提供额外的功能
2 静态代理是编译时生成代理类,动态代理是运行时生成
3 JDK 动态代理只能只能代理实现了接口的类或者直接代理接口,而 CGLIB 可以代理未实现任何接口的类
4 JDK动态代理是通过反射获取代理对象的类和方法,使用同一个接口的实现类做代理类,
而CGLIB是使用的拦截的方式获取代理对象的类和方法,使用的代理对象的子类作为代理类

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/32097.html

    标签: 反射&代理
    分享给朋友:

    “反射&代理反射代理” 的相关文章

    国内VPS安装Docker的详细步骤与优化技巧

    在决定开始安装Docker之前,首先需要为你的国内VPS做好一些准备工作。准备工作不仅可以帮助我们顺利完成Docker的安装,还能让过程更加高效。 首先,选择一个适合的VPS服务提供商至关重要。目前市场上有很多VPS服务商,例如阿里云、腾讯云、Linode等。在选择时,可以根据自己的需求考虑价格、性...

    RackNerd VPS服务测评:性价比高、稳定性强的主机商推荐

    在当今的网络世界中,选择合适的主机商显得尤为重要。我最近体验了RackNerd这家提供VPS服务的主机商,想和大家分享一些我的观点。RackNerd因其性价比高而广受好评,这让我在决定购买前进行了详细的测评。我会从多个角度来探讨RackNerd的各方面表现。 RackNerd不仅在价格上拥有明显优势...

    国外常用ping工具及其使用方法

    ping工具在国外的应用 什么是ping工具?其基本功能和重要性 ping工具是一种非常实用的网络诊断工具,通过向指定的IP地址发送数据包来检测网络连接的质量。当我们在互联网上进行访问时,ping工具能够帮助我们了解网络延迟、丢包率等关键指标。这些信息对于网站运营者和普通用户来说都是极其重要的,因为...

    bwh1:搬瓦工的高效VPS管理与使用技巧

    bwh1 概述 提到 bwh1,很多人第一时间就想到搬瓦工(BandwagonHost)。bwh1 正是搬瓦工的官网域名之一,深受用户喜爱。它不仅是一个简单的链接,更是通向高效 VPS 管理的窗口。通过这个网站,用户能够方便地访问各种服务,比如 VPS 购买、管理和支持。对于追求网络稳定性和速度的用...

    WordPress reCAPTCHA插件:提升网站安全与用户体验的最佳解决方案

    reCAPTCHA插件概述 在今天的网络环境中,安全性愈发重要,尤其是对于使用WordPress的网站。WordPress reCAPTCHA插件成为了一种流行的解决方案,它借助Google强大的reCAPTCHA服务,帮助我们有效地区分真实用户和可能扰乱网站的机器程序。在我接触这个插件之后,发现它...

    如何在AWS搭建VPS:详细指南与实用技巧

    在当今这个数字化快速发展的时代,云计算扮演着越来越重要的角色。无论是企业处理大量数据,还是个人用户存储信息,云服务都提供了一种灵活、高效的解决方案。特别是随着远程工作和在线服务的普及,能够随时随地访问和管理自己的数据成为一种必需。在这个过程中,亚马逊云(AWS)凭借其强大的服务和稳定的性能,成为了众...