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

Java动态代理机制java动态代理

22小时前CN2资讯

在Java的动态代理机制中,有两个重要的类。一个是InvocationHandler,另一个是Proxy。

  • InvocationHandler:每一个动态代理类都必须要实现InvocationHandler接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的invoke方法来进行调用。

    /**  *   * @param proxy     代理的真实对象  * @param method    调用真实对象的某个方法的method对象  * @param args      调用方法时传的参数  * @return          调用结果  * @throws Throwable  */@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {}
  • Proxy:动态的创建一个代理对象的类,我们用的比较多的就是newProxyInstance这个方法。

     /**  *  * @param loader      ClassLoader对象,由哪个ClassLoader对象来对生成的代理对象进行加载  * @param interfaces  Interface对象数组,提供一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这个我们就能调用这组接口中的方法了  * @param h           InvocationHandler对象,当这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上  */@CallerSensitivepublic static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException {}
  • Demo

    Subject接口

    public interface Subject {    void say(String str); }

    RealSubject类

    public class RealSubject implements Subject {    @Override     public void say(String str) {         System.out.println("hello , " + str);     } }

    动态代理类

    public class DynamicProxy implements InvocationHandler {    // 要代理的真实对象     private Object target;    // 给代理的真实对象赋初始值     public DynamicProxy(Object target) {        this.target = target;     }    @Override     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {         before();        // 当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用         method.invoke(target, args);         after();        return null;     }    public void before() {         System.out.println("before...");     }    public void after() {         System.out.println("after...");     } }

    Client类

    public class Client {    public static void main(String[] args) {         Subject realSubject = new RealSubject();        // 将要代理的真实对象传进去,最后是通过该真实对象来调用其方法的         InvocationHandler handler = new DynamicProxy(realSubject);        // 通过Proxy来创建对象         Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler);         System.out.println(subject.getClass().getName());         subject.say("webb");     } }

    输出结果

    com.sun.proxy.$Proxy0 before... hello , webbafter...

    我们看到subject.getClass().getName()看到打印出来的是 $Proxy0,首先解释下为什么这里可以将其转换为Subject类型的对象?原因就是在newProxyInstance这个方法的第二个参数上,我们给这个代理对象提供了一组什么接口,那么这个代理对象就会实现这种组接口,这个时候我们可以将这个代理对象强制类型转化为这组接口中的任意一个,因为这里的接口是Subject类型,所以就可以将它转化为Subject类型。同时我们一定要记住,通过Proxy.newProxyInstance 创建的代理对象是在jvm运行时动态生成的一个对象,它并不是我们的InvocationHandler类型,也不是我们定义的那组接口的类型,而是在运行是动态生成的一个对象,并且命名方式都是这样的形式,以$开头,proxy为中,最后一个数字表示对象的标号。

    当我们执行subject.say("webb");的时候,会自动跳转到由这个代理对象关联到的handler中的invoke方法去执行,而handler对象又接受了一个RealSubject类型的参数,表示我要代理的就是这个真实对象,所以此时就会调用handler中的invoke方法去执行。


    你可能想看:

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

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

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

    分享给朋友:

    “ Java动态代理机制java动态代理” 的相关文章

    测试IP地址的重要性与常用工具推荐

    在网络管理中,测试IP地址的重要性不可忽视。每当我遇到网络问题,测试IP地址就成了第一步。了解IP地址的状态和性能,不仅能帮助我找到问题所在,还能快速解决网络故障。这就像是医生给病人做检查,只有找出病因,才能对症下药。 我们在进行网络操作时,IP地址就像每台设备的身份名片。借助一些功能强大的工具,我...

    VPS流媒体解锁测试:确保顺畅访问全球流媒体内容

    在如今的互联网时代,流媒体已经成为我们日常生活中不可或缺的一部分。无论是观看热门电视剧,还是播放最新的音乐视频,流媒体服务的便捷性吸引了无数用户。然而,涉及不同地区提供的内容时,依然存在一些区域限制。这时,VPS(虚拟专用服务器)流媒体解锁技术的重要性便不言而喻。 VPS流媒体解锁是指通过虚拟专用服...

    LeaseWeb旧金山数据中心:为企业提供高效IT基础设施解决方案

    在谈到全球范围内的IT基础设施解决方案时,LeaseWeb无疑是一个重要的名字。成立于荷兰的LeaseWeb,凭借其卓越的服务和强大的网络能力,已经发展成为一家全球性的科技公司。它不仅提供传统的独立服务器服务,还涵盖了云计算、服务器托管等多样化的解决方案。对我而言,LeaseWeb就像是一座桥梁,连...

    狗云服务器怎么样?性能、服务与性价比全面解析

    狗云服务器(DogYun)自2019年成立以来,逐渐在国内云服务市场上崭露头角。最初的时候,我也只是偶然听说了这个名字,当时在寻找性能稳定又价格合理的云服务供应商时,恰好遇到了狗云。他们承诺提供高性价比的项目,这让我对他们充满了好奇。经过一番了解,发现狗云不仅仅是个新兴品牌,而是通过自身的技术积累和...

    Rocky Linux 更新源配置及优化方法

    我最近对Rocky Linux这款操作系统有了更深入的了解。Rocky Linux是一个以开源为基础的企业级操作系统,跟Red Hat Enterprise Linux(RHEL)兼容。它的设计宗旨在于为用户提供一个稳定和可靠的平台。因此,更新源就显得非常重要,影响着系统的升级和软件的安装。 选择合...

    Oracle Cloud 教学:从免费资源到项目实践的全方位指南

    在这个数字化的时代,云计算成为了技术发展的重要方向,而Oracle Cloud则为学习者提供了丰富的教学资源,涵盖从初学者到高级用户的各个层次。通过这些资源,我们可以轻松地开始云计算的学习之旅,更加熟悉这个领域的核心知识和技能。在Oracle Cloud的学习中,我发现了几个特别有帮助的项目,接下来...