如果想在运行时生成新的对象,并且这个对象的类型是全新的,是现有系统中没有的。就可以用Proxy类中的静态方法newProxyInstance来实现。其API如下:
public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler handler);
参数:
- loader: 类加载器。如果为null,就要默认类加载器
- interfaces: 这个新类要实现的接口组
- 调用处理器。
函数返回的对象类型是$Proxyn, (n >= 0. 第一次调用这个方法,新类名为$Proxy0, 第二个新类名为$Proxy1, 以此类推)
生成的$Proxyn 的源代码大致类似如此:
public final class $Proxy0 implements interfaces {
InvocationHandler handler;
public String toString() {
Method m = this.getClass().getMethod("toString");
handler.invoke(this, m, m.getParameters());
}
public int hashCode() {
Method m = this.getClass().getMethod("hashCode");
handler.invoke(this, m, m.getParameters());
}
public String equals() {
Method m = this.getClass().getMethod("equals");
handler.invoke(this, m, m.getParameters());
}
// 以下是实现interfaces的方法
public return_type interfaces_method(args...) {
Method m = this.getClass().getMethod("equals");
handler.invoke(this, m, m.getParameters());
}
... ...接口interfaces中的其他方法
}
当我们这样调用时: Object o = Proxy.newProxyInstance(null, interfaces, handler0);
就生成一个新$Proxy0类的对象o, 这个对象o的字段handler被赋值为handler0。$Proxy0实现了interfaces中所有的接口,其实现方式都一样,就是调用字段handler的invoke方法。其UML图如下:
posted on 2008-01-06 14:11
Jeff Lau 阅读(1474)
评论(1) 编辑 收藏 所属分类:
Jeff On Java 2008