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);}}

原创粉丝点击