时间:2021-05-20
JDK动态代理实现原理
动态代理机制
通过实现 InvocationHandler 接口创建自己的调用处理器
通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类
通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型
通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入
Interface InvocationHandler
该接口中仅定义了一个方法Object:invoke(Object obj,Method method,Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。
Proxy
该类即为动态代理类
Protected Proxy(InvocationHandler h)
构造函数,用于给内部的h赋值
Static Class getProxyClass (ClassLoader loader,Class[] interfaces)
获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组
Static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)
返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)
Dynamic Proxy
它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
代码示例
创建接口:
/** * @CreateDate: 2019/6/17 14:52 * @Version: 1.0 */public interface BuyService { String buyPhone(); String buyComputer();}创建实现类:
public class BuyServiceImpl implements BuyService { @Intercept("buyPhone") @Override public String buyPhone() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("==========BuyServiceImpl.class=============" + " buyPhone"); this.buyComputer(); return "buy phone"; } @Intercept("buyComputer") @Override public String buyComputer() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("==========BuyServiceImpl.class=============" + " buyComputer"); return "buy computer"; }}创建 InvocationHandler:
public class ReflectionHandler implements InvocationHandler { private Object target; public ReflectionHandler(Object target) { this.target = target; } public <T> T getProxy(){ return (T) Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(target,args); }}创建启动类:
public class Bootstrap { public static void main(String[] args) { // 动态代理实现 ReflectionHandler reflectionHandler = new ReflectionHandler(new BuyServiceImpl()); BuyService proxy = reflectionHandler.getProxy(); String computer = proxy.buyComputer(); String phone = proxy.buyPhone(); System.out.println(computer + "\r\n" + phone); }以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
java代理有jdk动态代理、cglib代理,这里只说下jdk动态代理,jdk动态代理主要使用的是java反射机制(既java.lang.reflect包)原理
详解javaJDK动态代理类分析(java.lang.reflect.Proxy)/***JDK动态代理类分析(java.lang.reflect.Proxy使
一、JDK动态代理Java在java.lang.reflect包中有自己的代理支持,该类(Proxy.java)用于动态生成代理类,只需传入目标接口、目标接口的
本文实例为大家分享了手动实现的一个简单JDK版动态代理,供大家参考,具体内容如下一.实现步骤1.根据目标类的接口类型生成代理类的java文件。2.编译代理类ja
Java语言中反射动态代理接口的解释与演示Java在JDK1.3的时候引入了动态代理机制、可以运用在框架编程与平台编程时候捕获事件、审核数据、日志等功能实现,首