一些对于动态代理的理解

92 阅读1分钟

首先,我们先定义一个用户接口,模拟一个用户登陆,查询,删除的示例,并且我们现在尝试调用这三个方法,如下图所示

image.png

如果说我们现在想要在登陆方法前加入信息显示:用户正在登陆,在查询方法前加入:正在查询,在删除方法前加入正在删除,并且模拟等待1s,和显示方法执行时间,那么我们将必须修改此UserTest类,此时我们的源码和测试结果如下所示

image.png 此时的需求实现是对我们的源代码存在入侵性,思考我们如何在不入侵源码的同时实现功能,此时我们的代理将起到关键的作用。 java反射包下提供了Proxy.newProxyInstance()方法创建一个对象的代理对象

此方法所需三个参数
ClassLoader loader:ClassLoader代指类加载器,一般我们传入当前类的类加载器
Class<?>[] interfaces:代表们所需要执行的接口数组
InvocationHandler h:真正的执行器提供invoke方法
        invoke(Object proxy, Method method, Object[] args) [此方法为回调方法]
        此方法提供三个参数
            --proxy:代理对象
            --method:需要执行的方法
            --args:方法执行所需参数数组

如下图所示,我们创建一个代理类并且回复UserTest代码并且代理UserTest实现上述需求所需功能 UserTest代码

image.png

代理对象创建方法

image.png

此时我们将测试类中创建UserTest对象替换为创建代理对象并执行结果如下 image.png

此时可以看见我们并没有修改源代码而是使用代理完成了需求。