动态代理的原理是什么?彻底理解java动态代理

KLQ 2020-05-19 14:32:09 java常见问答 4999

你知道java动态代理吗?那么它的原理又是怎样的呢?下面让我们一起彻底的来理解一下所谓的动态代理的原理吧。

首先简单的来给大家对动态代理做一个介绍。

动态代理其实就是一个代理机制。

假如你对设计模式当中的代理模式是很熟悉的,那么你一定会知道,可以将代理看成是对调用目标的一个包装,这样的话,对于目标代码的调用不是直接发生的,而是通过代理来完成的。

通过代理能够使得调用者和实现者之间解耦。

好比,通常进行RPC调用,框架内部的寻址、序列化、反系列化等,对于调用者来说一般都是没有很多的意义的,通过代理,能够使得界面更加的友善。

代理经历了从静态到动态的过程,源于静态代理引入的额外工作。

就好比是早期的RMI之类古董技术,还需要rmic之类工具生成静态stub等各种文件,增加了很多的繁琐的准备工作,而这和业务逻辑没有什么关系。

利用动态代理机制,相应的stub等类,能够在运行的时候生成,对应的调用操作也是动态完成,对生产力来一个极度的提升。

改进了之后,RMI已经不再需要手动去做这些事情了,虽然说它依旧是比较落后的技术,未来也许会被逐渐的移除掉。

下面来看一个简单的JDK动态代理的例子。

public class MyDynamicProxy {
    public static void main(String[] args) {
        HelloImpl hello = new HelloImpl();
        MyInvocationHandler handler = new MyInvocationHandler(hello);
        // 构造代码实例
        Hello proxyHello = (Hello) Proxy.newProxyInstance(
            HelloImpl.class.getClassLoader()
            , HelloImpl.class.getInterfaces()
            , handler);
        // 调用代理方法
        proxyHello.sayHello();
    }
    static interface Hello {
        void sayHello();
    }
    static class HelloImpl implements Hello {
        @Override
        public void sayHello() {
            System.out.println("Hello World");
        }
    }
    static class MyInvocationHandler implements InvocationHandler {
        private Object target;
        public MyInvocationHandler(Object target) {
            this.target = target;
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("Invoking sayHello");
            Object result = method.invoke(target, args);
            return result;
        }
    }
}

上面的例子,简单的实现了实现了动态代理的构建和代理操作。

简单来说:

1、实现对应的InvocationHandler

2、以接口Hello为纽带,为被调用目标构建代理对象,这样的话应用程序就能够使用代理对象间接运行调用目标的逻辑,代理为应用插入额外逻辑(这里是println)提供了便利的入口。

以上的内容就是对于动态代理的简单介绍,看完这些你都弄明白了吗?你对于动态代理还有什么疑问呢?

更多java方面的问题,大家可以继续关注奇Q工具网的常见问题栏目来了解哦。

推荐阅读:

红黑树的底层实现原理有哪些?红黑树又是什么?

SpringBoot底层实现原理是什么?它的概念又是什么?

mybatis原理都有哪些?mybatis是什么?