您的位置:首页技术文章
文章详情页

Java JDK动态代理实现原理实例解析

【字号: 日期:2022-08-30 14:49:58浏览:2作者:猪猪

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 + 'rn' + phone); }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持好吧啦网。

标签: Java
相关文章: