import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Vector;public class VectorProxy implements InvocationHandler
{
private Object proxyObj; public VectorProxy(Object obj)
{
this.proxyObj = obj;
} public static Object factory(Object obj)
{
Class<?> classType = obj.getClass(); return Proxy.newProxyInstance(classType.getClassLoader(),
classType.getInterfaces(), new VectorProxy(obj));
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
System.out.println("before calling: " + method);

if(null != args)
{
for(Object obj : args)
{
System.out.println(obj);
}
}

Object object = method.invoke(proxyObj, args);

System.out.println("after calling: " + method);

return object;
}

public static void main(String[] args)
{
List v = (List)factory(new Vector());

System.out.println(v.getClass().getName());

v.add("New"); }
















}
运行结果是:
$Proxy0
before calling: public abstract boolean java.util.List.add(java.lang.Object)
New
after calling: public abstract boolean java.util.List.add(java.lang.Object)
为什么要执行的method打印出来是list接口的?接口不是没实现方法么?

解决方案 »

  1.   

    v.add("New");
    v是声明为List接口的
    楼主你试试用Vector v=(Vector)factory(new Vector());
    看出来是什么吧
      

  2.   

    这样不行的吧。代理类的newInstance方法返回的是一个实现了List接口的对象,转成Vector就错了。
    但是method方法指向了list的抽象,他执行的却是Vector的方法。很难理解啊。
      

  3.   

    lz要弄明白什么是代理,一般的代理是怎么是实现的,然后再实现动态的代理,其次你要明白list和Vetor是什么管理,vector是实现了list接口的子类,那么你调用了list的方法实际上调用的是vettor实现了的方法。故而能够是实现呢,下面给你一个一般代理的例子,你先看一下呢
    import java.util.*;
    interface NetWork //定义NetWork接口
    {
    public void browse(); //定义上网浏览的抽象方法
    };class Real implements NetWork //真实的上网操作
    {
    public void browse(){ //覆写抽象方法
    System.out.println("上网浏览信息");
    }
    };class Porxy implements NetWork //定义代理上网
    {
    private NetWork network;
    public Porxy(NetWork network){ //设置代理的真实操作
    this.network = network; //设置代理的子类
    }
    public void check(){
    System.out.println("检查用户合法性");
    }
    public void browse(){
    this.check();
    this.network.browse();
    }
    };
    class Demo01 
    {
    public static void main(String[] args) 
    {
    NetWork net = null;
    net = new Porxy(new Real());
    net.browse();
    System.out.println("==================================");
    List<String> list = null; //和上面的上网类似
    list = new Vector<String>();
    list.add("sdsds");
    System.out.println(list.toString()); }
    }