Java动态代理(主要是对六个参数的理解)
来源:互联网 发布:java实现国际化 编辑:程序博客网 时间:2024/06/02 08:06
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() {@Overridepublic 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()}});// 代理类对象 每次调用方法 ,都会执行 invokeSystem.out.println(proxy.toString());proxy.add("xxx");System.out.println(proxy.getClass() + "=========xx"); proxy.addAll(list2);}}
阅读全文
0 0
- Java动态代理(主要是对六个参数的理解)
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解
- 对代理模式与Java动态代理类的理解(转)
- 对代理模式与Java动态代理类的理解(转)
- java学习整理20170804
- tomcat的maxThreads、acceptCount(最大线程数、最大排队数)
- Python copy与deepcopy的区别
- 启动mysql提示Starting MySQL... ERROR! 解决方法
- Unity Joystick 虚拟摇杆的实现
- Java动态代理(主要是对六个参数的理解)
- select源码剖析
- Audio 环形buffer
- 时隔好几个好几天,又到js
- 插入排序(内附代码)
- 使用xshell链接Linux
- SSM(spring +springmvc +mybatis)框架搭建
- day21桶排序一个无序数组+求一个无序数组中的中位数
- HDU 4912 LCA+策略