Proxy代理系列—JDK动态代理
2021-02-01 22:49:33 2 举报
主要讲解JDK动态代理的实现和底层原理分析
作者其他创作
大纲/内容
返回代理类实例,执行目标对象的应用逻辑
调用
Method.invoke()反射目标类方法调用
public interface SanGuoService { void warfare(String username);}
接口-三国
应用逻辑
Proxy inner ProxyClassFactory
JDK动态代理工具实现
//// Source code recreated from a .class file by IntelliJ IDEA// (powered by FernFlower decompiler)//import com.example.demo.proxy.dynamicproxy.jdk.SanGuoService;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.lang.reflect.UndeclaredThrowableException;public final class font color=\"#ff0000\
代理类 代码逻辑
反射调用
在内存中生成代理类字节码
defineClass0本地navtive将字节码加载到内存中
public class LiuBeiServiceImpl implements SanGuoService{ @Override public void warfare(String username) { System.err.println(\"LiuBei-warfare:\"+username); }}
目标类-刘备
目标类(Object)
+ warfare()
将调用处理器InvocationHandler作为代理类实例的构造参数传给代理类的父类Proxy构造器
ProxyGenerator
generateMethod()为代理方法生成代码
newInstance(new Object[]{h})
使用
Proxy.newProxyInstance
三国服务
getConstructor返回一个Constructor对象,该对象反映此Class对象表示的类的指定公共构造函数
newProxyInstance()(指定接口的代理类的实例)
代理类对象(Proxy Object)
+ warfare()
getProxyClass0()(生成代理类。 在调用此方法之前,必须调用checkProxyAccess方法执行权限检查。)
代理类实现的接口方法,方法调用父类InvocationHandler的invoke方法执行拦截逻辑
组成MethodInfo对象包含有关正在生成的类中的特定方法的信息
对代理类的基本信息进行拼装
public class ProxyClassTest { public static void main(String[] args) { CaoCaoServiceImpl caoCaoServiceImpl =new CaoCaoServiceImpl(); String className = \"proxyName001\
内存中代理类字节码输出文件逻辑
Proxy
创建代理类实例
newInstance(new Object[]{h})使用指定的初始化参数来创建和初始化构造函数的声明类的新实例
String proxyName = proxyPkg + proxyClassNamePrefix + num;生成代理类名称包+$proxy+自增AtomicLong
生成代理类代码文件
生成代理类字节码
Proxy提供了用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类
调用处理器(InvocationHandler)
+ invoke()--->Method.invoke()
WeakCache
总结
1、本质:利用字节码技术动态生成类和实例实现对应目标类的接口类,所以有相同的方法,并且本质是指针地址问题。2、过程:将需要代理的目标类实例和重写调用处理器方法(InvocationHandler.invoke),传入为字节码的拼装提供原材料。3、最后:调用处理器invoke通过方法反射(Method.invoke())调用目标类方法,实现逻辑解藕。4、调度处理器InvocationHandler其实只是一个定义好的扩展类参数,完全可以自己模仿自定义。
构造器参数创建
ProxyGenerator inner ProxyMethod
看仔细代理类信息就明白
gen.generateClassFile()生成代理类的类文件
public class JDKSimpleDynamicProxyTest { public static void main(String[] args) { JDKSimpleDynamicProxy jdkSimpleDynamicProxy = new JDKSimpleDynamicProxy(); SanGuoService sanGuoService = jdkSimpleDynamicProxy.getNewProxy(new LiuBeiServiceImpl()); System.err.println(\"sanGuoService:\"+sanGuoService.getClass().getName()); sanGuoService.warfare(\"刘备\"); }}
生成代理类测试
0 条评论
下一页