资讯专栏INFORMATION COLUMN

动态代理模式实现原理

songjz / 1928人阅读

摘要:代理模式概念代理模式分为两种,一种是静态代理模式,一种是动态代理模式。面向切面的编程也是使用动态代理模式来实现的。

1.代理模式概念
代理模式分为两种,一种是静态代理模式,一种是动态代理模式。
静态代理模式:在程序运行之前需要写好代理类
动态代理模式:在程序运行期间动态生成代理类
2.动态代理的实现
动态代理实现的步骤:
(1)写一个代理类SubjectHandler实现InvocationHandler接口,重写invoke方法,
   通过构造函数把代理的对象realSubject传入到此处理类中,
   在invoke方法中增加method.invoke(realSubject, args);
public interface Subject
{
    public void rent();
}
public class RealSubject implements Subject
{
    @Override
    public void rent()
    {
        System.out.println("I want to rent my house");
    }
}
public class SubjectHandler implements InvocationHandler
{
    private Subject subject;
    public SubjectHandler(Subject subject)
    {
        this.subject = subject;
    }
    
    @Override
    public Object invoke(Object object, Method method, Object[] args) throws Throwable
    {
        System.out.println("before rent house");
        method.invoke(subject, args);
        System.out.println("after rent house");
        return null;
    }
}
   
(2)在调用方法中增加代码即可完成调用
public class Client
{
    public static void main(String[] args)
    {
        RealSubject realSubject = new RealSubject();
        //生成代理类的对象
        Subject subject = (Subject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), new SubjectHandler(realSubject));
        subject.rent(); //调用代理类的方法
    }
}
//第一个参数为realSubject的classloader
//第二个参数为realSubject的所有接口
//第三个参数为处理类

上面的内容是几年前在网上看到的,具体出自那篇文章忘记了,动态代理的处理过程大体如上。

3.动态代理的实现过程

通过看马士兵的设计模式中的代理模式教程,对代理模式的内部实现原理有了更清楚的认识,下面的图片是自己总结的代理类的产生过程:

下面的代码来自马士兵关于动态代理讲解的源码

        //模拟代理类的实现代码
        //把出来的内容写入文件中
        String fileName = 
            "d:/src/com/proxy/$Proxy1.java";
        File f = new File(fileName);
        FileWriter fw = new FileWriter(f);
        fw.write(src);
        fw.flush();
        fw.close();
        
        //编译文件,
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
        Iterable units = fileMgr.getJavaFileObjects(fileName);
        CompilationTask t = compiler.getTask(null, fileMgr, null, null, null, units);
        t.call();
        fileMgr.close();
        
        //把class文件加载到内存中,通过构造方法生成代理的对象
        URL[] urls = new URL[] {new URL("file:/" + "d:/src/")};
        URLClassLoader ul = new URLClassLoader(urls);
        Class c = ul.loadClass("com.proxy.$Proxy1");
        System.out.println(c);
        
        Constructor ctr = c.getConstructor(InvocationHandler.class);
        Object m = ctr.newInstance(h);
        return m;

在生成的代理类中对应的方法如下

private static Method m0;
public final void rent() {
        try {
            super.h.invoke(this, m0, null);
            return;
        } catch (Error e) {
        } catch (Throwable throwable) {
            throw new UndeclaredThrowableException(throwable);
        }
}
       

从上面我们可以看出,生成的代理对象subject 调用rent方法,其实是调用的上面代理类中生成的rent方法,在rent方法中调用了SubjectHandler 的invoke方法,通过上面的流程梳理,对于代理模式理解就更容易一些。

spring aop面向切面的编程也是使用动态代理模式来实现的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67265.html

相关文章

  • Java动态代理 jdk和cglib的实现比较

    摘要:与静态代理对比,动态代理是在动态生成代理类,由代理类完成对具体方法的封装,实现的功能。本文将分析中两种动态代理的实现方式,和,比较它们的异同。那如何动态编译呢你可以使用,这是一个封装了的库,帮助你方便地实现动态编译源代码。 发现Java面试很喜欢问Spring AOP怎么实现的之类的问题,所以写一篇文章来整理一下。关于AOP和代理模式的概念这里并不做赘述,而是直奔主题,即AOP的实现方...

    h9911 评论0 收藏0
  • java动态代理及RPC框架介绍

    摘要:这种语法,在中被称为动态代理。在动态代理机制中,这个角色只能是接口。动态代理就是实现的技术之一。 所谓动态代理,指的是语言提供的一种语法,能够将对对象中不同方法的调用重定向到一个统一的处理函数中来。python重写__getattr__函数能够做到这一点,就连世界上最好的语言也提供称为魔术方法的__call。这种语法除了能更好的实现动态代理外,还是RPC框架实现原理的一部分。 动态代理...

    2shou 评论0 收藏0
  • JAVA代理模式的理解和应用

    摘要:代理模式代理模式通俗一点的解释就是在操作一个对象和对象中的方法时,不是直接操作这个对象,还是通过一个代理对象来操作这个实际的目标对象。 代理模式: 代理模式通俗一点的解释就是在操作一个对象和对象中的方法时,不是直接操作这个对象,还是通过一个代理对象来操作这个实际的目标对象。应用场景一般是需要在执行某个已经写好的方法前后再添加一段逻辑,比如执行方法前打印日志,或者在执行方法之前和之后打时...

    CatalpaFlat 评论0 收藏0
  • 【干货】JDK动态代理实现原理以及如何手写一个JDK动态代理

    摘要:代理模式从类型上来说,可以分为静态代理和动态代理两种类型。然而今天的重点是我们都知道牛逼轰轰的的实现的一种方式是使用的动态代理另一种是,大部分人也会用的动态代理,不过没有研究过的动态代理到底是怎么实现的。 动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位。代理模式从类型上来说,可以分为静态代理和动态代...

    forsigner 评论0 收藏0
  • Java三种代理模式:静态代理动态代理和cglib代理

    摘要:动态代理又被称为代理或接口代理。静态代理在编译时产生字节码文件,可以直接使用,效率高。代理无需实现接口,通过生成类字节码实现代理,比反射稍快,不存在性能问题,但会继承目标对象,需要重写方法,所以目标对象不能为类。 一、代理模式介绍 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功...

    Kaede 评论0 收藏0

发表评论

0条评论

songjz

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<