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接口的?接口不是没实现方法么?
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接口的?接口不是没实现方法么?
v是声明为List接口的
楼主你试试用Vector v=(Vector)factory(new Vector());
看出来是什么吧
但是method方法指向了list的抽象,他执行的却是Vector的方法。很难理解啊。
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()); }
}