时间:2021-05-19
代理对象的生成方法是:
Proxy.newProxyInstance(...) ,进入这个方法内部,一步一步往下走会发现会调用
ProxyGenerator.generateProxyClass() ,这个方法用来生成代理类的字节码。
下面通过调用 ProxyGenerator.generateProxyClass()方法在本地生成代理类。
1.首先要有一个接口
2.生成代理类的方法如下
3.将生成的代理类导入到idea中查看是长这样
//// Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//import com.example.springboottest.config.OrderService;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.lang.reflect.UndeclaredThrowableException;protected static class $OrderService extends Proxy implements OrderService { private static Method m1; private static Method m3; private static Method m2; private static Method m0; public $OrderService(InvocationHandler var1) throws { super(var1); } public final boolean equals(Object var1) throws { try { return (Boolean)super.h.invoke(this, m1, new Object[]{var1}); } catch (RuntimeException | Error var3) { throw var3; } catch (Throwable var4) { throw new UndeclaredThrowableException(var4); } } public final void query() throws { try { super.h.invoke(this, m3, (Object[])null); } catch (RuntimeException | Error var2) { throw var2; } catch (Throwable var3) { throw new UndeclaredThrowableException(var3); } } public final String toString() throws { try { return (String)super.h.invoke(this, m2, (Object[])null); } catch (RuntimeException | Error var2) { throw var2; } catch (Throwable var3) { throw new UndeclaredThrowableException(var3); } } public final int hashCode() throws { try { return (Integer)super.h.invoke(this, m0, (Object[])null); } catch (RuntimeException | Error var2) { throw var2; } catch (Throwable var3) { throw new UndeclaredThrowableException(var3); } } static { try { m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object")); m3 = Class.forName("com.example.springboottest.config.OrderService").getMethod("query"); m2 = Class.forName("java.lang.Object").getMethod("toString"); m0 = Class.forName("java.lang.Object").getMethod("hashCode"); } catch (NoSuchMethodException var2) { throw new NoSuchMethodError(var2.getMessage()); } catch (ClassNotFoundException var3) { throw new NoClassDefFoundError(var3.getMessage()); } }}可以发现在代理类中的构造方法中传入了我们实现的InvocationHandler,在调用方法时会回调invoke方法。
还可以发现代理类中继承了Proxy,由于java中是单继承的,所以java动态代理是针对接口的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
详解javaJDK动态代理类分析(java.lang.reflect.Proxy)/***JDK动态代理类分析(java.lang.reflect.Proxy使
1、动态代理的特点:字节码随用随创建,随用随加载2、作用:不修改源码的基础上对源码进行加强3、分类:(1)基于接口的动态代理:涉及到的类:Proxy,由JDK官
java代理有jdk动态代理、cglib代理,这里只说下jdk动态代理,jdk动态代理主要使用的是java反射机制(既java.lang.reflect包)原理
今天来介绍另一种更为强大的代理——Cglib动态代理。 什么是Cglib动态代理? 我们先回顾一下上一篇的jdk动态代理,jdk动态代理是通过接口来在运
FileReader和FileWriter源码分析1.FileReader源码(基于jdk1.7.40)packagejava.io;publicclassFi