3.4.3:新建一个类,命名为CalCulatorDynamicProxy,也就是我们的代理类,用来对上面的类进行代理:
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.Arrays;public class CalCulatorDynamicProxy { //动态代理类private Calculator calculator;//要代理的对象public CalCulatorDynamicProxy(Calculator calculator) {this.calculator = calculator;}public Calculator getCalculator() {Calculator proxy = null;ClassLoader loader =calculator.getClass().getClassLoader();//获取类加载器Class[] interfaces = new Class[]{Calculator.class};//代理对象的类型InvocationHandler h = new InvocationHandler() {//调用处理器//proxy:正在返回的代理对象//method:被调用的方法//args:传入的参数@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("---日志记录开始---");String name = method.getName();//获取方法的名字System.out.println("方法"+name+"()开始执行了");System.out.println("方法中的参数是:"+Arrays.asList(args));Object result = method.invoke(calculator, args);System.out.println("方法执行后的结果是"+result);return result;}};proxy=(Calculator)Proxy.newProxyInstance(loader, interfaces, h);//代理对象return proxy;}}这里要特别强调的问题就是:invoke()方法,注意其中的参数,分别是被代理对象、方法、和对象参数,这里的原理是反射,通过获取原对象的class对象,然后进行处理,我们可以通过method对象拿到被代理对象的方法,也是add()、mul()、sub()、div()方法,也可以通过args对象数组取得传入的参数,比如我们具体传入的数值,再通过method.invoke()方法进行调用,就进行了被代理对象的方法的执行,然后就是返回的结果(如果方法前为void,返回的就是null)
3.4.4:我们来做具体的测试
public class Test {public static void main(String[] args) {Calculator cal = new CalculatorImpl();Calculator proxy = new CalCulatorDynamicProxy(cal).getCalculator();int add = proxy.add(29, 1);int sub = proxy.sub(9, 2);int mul = proxy.mul(3, 7);double div = proxy.div(6,8);}}具体的测试结果:
---日志记录开始---方法add()开始执行了方法中的参数是:[29, 1]方法执行后的结果是30---日志记录开始---方法sub()开始执行了方法中的参数是:[9, 2]方法执行后的结果是7---日志记录开始---方法mul()开始执行了方法中的参数是:[3, 7]方法执行后的结果是21---日志记录开始---方法div()开始执行了方法中的参数是:[6, 8]方法执行后的结果是0.0可以看出动态代理模式轻松完成了对被代理对象的日志记录功能,并且只用写一次,这样即便有成百上千的方法我们也不怕,这就是动态代理领先于静态代理之处,虽然实现起来有点麻烦,但是其方便,动态的给被代理对象添加功能 。我们所写的重复代码更少,做的事情更少 。
四:总结
本篇博客介绍了动态代理和静态代理的概念,并对其进行了代码实现,在实际的工作中,我们会经常遇到需要代理模式的地方,希望能多多思考,促进我们形成一定的思维模式 。并且动态代理作为SpringAop的实现原理,封装了动态代理,让我们实现起来更加方便,对于这部分内容可以只做了解,理解其背后的运行机制即可,并不需要具体实现,如果需要实现,直接使用spring的Aop功能即可 。
希望看完本篇,能对代理这种思维有深入的理解 。好了,本篇文章就讲到这里,谢谢 。
推荐阅读
- 解析服务型智能机器人的学习方法论
- 摩托罗拉|全球首发2亿像素!陈劲晒moto X30 Pro真机样张:解析力超强
- must+have done用法解析 done是什么意思
- 深度体验拼多多旗舰机 VJVJ vj是什么
- 简单百搭帽子编织方法步骤解析 帽子织法
- 改善Java代码的八个建议
- JavaScript实战3D建模软件开发
- 天文航天|23吨全球第一!中国“问天”舱深度揭秘:这5点无敌
- While用法解析及其和when 与as区别 while是什么意思
- CNN通俗解析 cnn是什么
