标签:unit loader instance tar 自己的 static trace this 方法
通过实现 InvocationHandler 接口创建自己的调用处理器
通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类
通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型
通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入
该接口中仅定义了一个方法Object:invoke(Object obj,Method method,Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。
该类即为动态代理类
Protected Proxy(InvocationHandler h)
Static Class getProxyClass (ClassLoader loader,Class[] interfaces)
Static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)
Dynamic Proxy
创建接口:
/** * @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); }
标签:unit loader instance tar 自己的 static trace this 方法
原文地址:https://www.cnblogs.com/hkMblogs/p/13171733.html