标签:ati main onclick 字节码 col code eth this click
jdk实现的动态代理只能是基于接口的;即被代理的对象
生成动态代理的类:
public class ProxyTool { /** * 需要被代理的类 */ private Object obj; public ProxyTool(Object obj){ this.obj = obj; } /** * Proxy.newProxyInstance()方法有三个参数: * ClassLoader:用于加载代理对象的字节码,与被代理对象的类加载器保持一致,固定写法 * Class[]:字节码数据,用于让代理类与被代理类有相同的方法,固定写法 * InvocationHandler: 用于提供增强的代码,InvocationHandler接口中有一个方法 invoke() * * * invoke中有三个参数: * proxy:代理对象 * method:当前执行的方法 * args:当前执行方法的参数 * @return */ public Object getProxy(){ return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException { //写增强代码的地方 System.out.println("动态代理生效"); return method.invoke(obj,args); } }); } }
测试方法:
public class Main { public static void main(String[] args) { //被代理对象 IProxyImpl proxy1 = new IProxyImpl(); //代理工具 ProxyTool ProxyTool = new ProxyTool(proxy1); //获取到代理类,这个地方只能强转为接口,强转为实现类会报错 IProxy proxy = (IProxy)ProxyTool.getProxy(); //执行方法 proxy.print(); } }
标签:ati main onclick 字节码 col code eth this click
原文地址:https://www.cnblogs.com/zhaolei1996/p/12423837.html