Java 动态代理例子

holder

package au.edu.utas;

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 DynProxy {
    public static void main(String[] args) {
        final List list = new ArrayList();
        Object obj = Proxy.newProxyInstance(
                DynProxy.class.getClassLoader(), 
                new Class[]{List.class}, 
                new InvocationHandler(){
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // System.out.println("object: "+proxy.hashCode());  这个会产生dead circle
                        //proxy就是被代理的对象,在这里又一次invoke的话,就继续进入下一个invoke.
                        System.out.println("execute method: "+method.getName());
                        if(method.getName().equals("toString")){
                            Object returnValue = method.invoke(list, args);
                            System.out.println("returnValue: "+returnValue);
                            //如果return是null就是代表这个方法不放行
                            return null;
                        }else if(method.getName().equals("add")) {
                            //modify the value for first.
                            return method.invoke(list, args[0]+" modify");
                        }else{
                            return method.invoke(list, args);
                        }
                    }
                });
        System.out.println("obj: "+obj);
        List list2 = (List)obj;
        list2.add("hello world");
        list2.add("test");
        list2.add("utas");
        list2.add("hobart");
        System.out.println("value: "+list2.get(0));
    }
}

 

posted on 2016-09-20 21:26  yeatschen  阅读(94)  评论(0)    收藏  举报

导航