Java动态代理(主要是对六个参数的理解)
2017-08-04 00:33
465 查看
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.List; /* * 动态代理:程序运行时,生成一个代理类对象,代替原有的类做事情. 方法上的增强. * 代理:替别人做事情. * 动态:运行时. * * * * 继承 : 子类重写父类方法 可以增强 . * 包装 : BufferedXxx增强 普通FileXX流. read writ * 动态代理:方法上的增强. * * 通过 Proxy 类 生成的代理类对象. * * Proxy.newProxyInstance(loader, interfaces, h) * ClassLoader loader : 类加载器 . 当前类的加载器,传递进去即可. * Class[] interfaces : 被代理类(歌手)的所有接口. 这些接口是给生成代理类(经纪人)时使用的. * InvocationHandler h : 处理类. 指定代理类如何执行方法. * 每次调用代理对象的方法,都会执行invoke * public Object invoke(Object proxy, Method method, Object[] args){} * proxy : 代理对象. * method : 正在调用的方法 * args[] : 正在调用的方法的实际参数 * * Object :返回值类型 .. * Object o = proxy.method(args); */ public class Demo { public static void main(String[] args) { // 创建集合添加元素 final ArrayList<String> list = new ArrayList(); final ArrayList<String> list2 = new ArrayList(); list2.add("3333333333333"); list.add("aaa"); list.add("aaa"); list.add("aaa"); list.add("aaa"); /* * newProxyInstance(ClassLoader loader, Class<?>[] interfaces, * InvocationHandler h) 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。 */ // 由上面这句话(API里的)可知newProxyInstance的返回值只能是一个接口的实例.. // 也就是说前面只能写成接口的形式-----------此处用到了多态 List proxy = (List) Proxy.newProxyInstance(list.getClass().getClassLoader(), list.getClass().getInterfaces(), /* * InvocationHandler 处理类.如何执行方法. */ new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // System.out.println("invoke 执行"); // System.out.println(method.getName()); // return "abc"; System.out.println("====" + proxy.getClass()); // 不能调用 add 和remove . if ("add".equals(method.getName())) { System.out.println("不能添加 "); // throw new UnsupportedOperationException("不能添加") ; return false; } if ("remove".equals(method.getName())) { System.out.println("不能移除"); throw new UnsupportedOperationException("不能移除"); } Object invoke = method.invoke(list, args); return invoke; //注意这里return的对象会被proxy对象接收到(本来是Object类型,但为了能执行被代理对象的功能, //会将其转换成被代理对象的接口的实例),所以为了避免出现类型转换异常的错误出现 //这里一般return的是method.invoke() } }); // 代理类对象 每次调用方法 ,都会执行 invoke System.out.println(proxy.toString()); proxy.add("xxx"); System.out.println(proxy.getClass() + "=========xx"); proxy.addAll(list2); } }
相关文章推荐
- [Java] 动态代理 03 --(解决接口也当参数传)
- 十分钟理解Java中的动态代理
- 深入理解java动态代理机制
- 理解JAVA动态代理
- 透彻理解Java动态代理机制
- java动态代理理解
- 彻底理解JAVA动态代理
- 彻底理解Java动态代理
- Java动态代理的理解(知乎转发)
- 彻底理解JAVA动态代理
- Java 动态代理的理解与Cglib动态代理实现
- Java 动态代理深入理解
- 十分钟理解Java中的动态代理
- 理解Java动态代理(1)—找我还钱?我出钱要你的命
- java动态代理之自我理解
- java 动态代理初步理解
- 彻底理解JAVA动态代理
- 彻底理解JAVA动态代理
- 十分钟理解Java中的动态代理
- Java动态代理再理解