
转载声明:原文链接:https://blog.csdn.net/weixin_44042734/article/details/125819166
相信很多小伙伴都不理解动态代理,
它是怎么代理的?怎么用?听了很多课程还是不会
我这次用最简单通俗易懂的代码来解释jdk动态代理,希望各位小伙伴能听懂,喜欢就点个赞在走吧!
活不多说,直接上代码.
第一种: 最简代码(需要会lambda,反射知识才能看懂)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public static void main(String[] args) { //主方法 ClacInterface myClac = new MyClac(); //被代理的对象 //生成了一个代理类对象proxyBean ClacInterface proxyBean = (ClacInterface)Proxy.newProxyInstance( //第一个参数被代理类的类加载器 myClac.getClass().getClassLoader(), //第二个参数myClac的所以实现接口 myClac.getClass().getInterfaces(), //第三参数是InvocationHandler 这里是lambda简化的匿名内部类写法 (a, b, c) -> { System.out.println( "我代理了myClac对象" ); return b.invoke(myClac, c); } ); System.out.println( "proxyBean.add(1, 3) = " + proxyBean.add(1, 3)); } |
输出结果
接口
1 2 3 | public interface ClacInterface { int add(int a ,int b ); } |
实现类
1 2 3 4 5 6 7 | public class MyClac implements ClacInterface{ @Override public int add(int a, int b) { System.out.println( "a+b" + "=" +(a+b)); return a+b; } } |
使用动态代理的目的: 增强代理对象的方法
上面的代码就实现了动态代理, 通过jdkProxy类生成了一个proxyBean(这个对象就是代理对象)
然后执行了被代理对象MyClac中的方法.
这也就是动态代理,运行时生成了一个代理对象!
哈哈,可能很多小伙伴看到这是一脸懵逼,我把上面代码都详细解释和改造成第二版
第二版(详细解释每一步具体意思)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public static void main(String[] args) { //创建接口的实现类对象,也就是被代理对象 ClacInterface myClac = new MyClac(); //获取被代理实现类对象的Class对象 Class<? extends ClacInterface> clazz = myClac.getClass(); //第一个参数,被代理对象的类加载器 ClassLoader classLoader = clazz.getClassLoader(); //第二个参数,被代理对象实现的所有接口数组 Class<?>[] interfaces = clazz.getInterfaces(); //通过调用Proxy.newProxyInstance的方法来创建一个代理类对象来代理myClac对象 ClacInterface proxyBean = (ClacInterface)Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() { //第三个参数InvocationHandler的实现类,这里用了匿名内部类的方式 @Override //重写InvocationHandler的invoke方法,他有三个参数可以供我们使用 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //第一个参数proxy 可以通过proxy.getClass().getClassName() 来查看对象,是一个匿名的Proxy的代理类 System.out.println( "proxy.getClass().getName() = " + proxy.getClass().getName()); System.out.println( "前置增强------" ); //第二个参数method 也就是被代理对象myClac对象的方法,可以通过method调用myClac的方法 //第三个参数args 也就是MyClac方法执行时传入的实际参数 //method.invoke的返回值就是myClac方法的返回值 Object invoke = method.invoke(myClac, args); System.out.println( "后置增强------" ); return invoke; } }); System.out.println( "proxyBean.add(1, 3) = " + proxyBean.add(1, 3)); } |
输出结果
到这里,我觉得很多小伙伴可能已经理解了动态代理代码怎么实现,也有可能是一脸懵,所以我在文末总结了下jdk动态代理:
java反射包中的Proxy类可以调用newProxyInstance创建一个代理类对象.
传入三个参数,
一个是代理类的类加载器,
一个是实现的所有接口数组,
一个调用处理器的实现类.
创建好了代理对象,代理对象就可以执行被代理类实现的接口的方法,在执行方法时,会先去执行调用处理器实现类中的invoke方法,invoke方法就可以对被代理类进行功能增强.
银河绘日
08月17日
一起学习