zoukankan      html  css  js  c++  java
  • hadoop21---使用代理修改List,代理流程

    package cn.itcast_05_proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.util.ArrayList;
    import java.util.List;
    
    public class ListDemo {
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public static void main(String[] args) throws Exception {
            final List list = new ArrayList();
            //这是被代理的
            Object oo = Proxy.newProxyInstance(List.class.getClassLoader(),
                    list.getClass().getInterfaces(),new InvocationHandler() {
                        public Object invoke(Object proxy, Method method, Object[] args)
                                throws Throwable {
                            System.err.println("加入一个对象:");
                            Object returnValue = method.invoke(list, args);//反射
                            System.err.println("加入完成。。。。");
                            if(method.getName().equals("size")){
                                return 100;
                            }
                            return returnValue;
                        }
                    });
            List list2 = (List) oo;
            list2.add("aaa");
            list2.add("bbb");
            
            System.err.println("size:"+list2.size()+","+list.size());//100,2
            //为什么调用3次?
            //list2.size()这个也调用
        }
    }
    代理实现流程:
    1、书写代理类和代理方法,在代理方法中实现代理Proxy.newProxyInstance
    2、代理中需要的参数分别为:被代理的类的类加载器soneObjectclass.getClassLoader(),被代理类的所有实现接口new Class[] { Interface.class },句柄方法new InvocationHandler()
    3、在句柄方法中复写invoke方法,invoke方法的输入有3个参数Object proxy(代理类对象), Method method(被代理类的方法),Object[] args(被代理类方法的传入参数),在这个方法中,我们可以定制化的开发新的业务。
    4、获取代理类,强转成被代理的接口
    5、最后,我们可以像没被代理一样,调用接口的认可方法,方法被调用后,方法名和参数列表将被传入代理类的invoke方法中,进行新业务的逻辑流程。
            原业务接口IBoss
  • 相关阅读:
    鸽巢原理(The Pigeonhole Principle)(抽屉原理)
    VS2010显示行号
    HDU 2546 饭卡
    组合数学之排列组合(Permutations and Combinations)(四种情况)
    php中的$_SERVER方法初识
    重新认识hasLayout——IE浏览器css bug的一大罪恶根源 转
    javascript实现简单的链式调用
    Javascript 静态类的实现
    Object类相关的属性,方法和操作符
    <转>前端开发中的MCRV模式
  • 原文地址:https://www.cnblogs.com/yaowen/p/9028260.html
Copyright © 2011-2022 走看看