);
}&Exceptions
&Return
sync 方法还会在构造函数尾部被调用,从而将被代理类对象的变量信息同步 到代理类对象,实现类似于拷贝构造的等价效果。相应的,构造函数模板也需要 更新以支持该新特性。
清单 9. 更新后的构造函数模板
public &Name(java.lang.reflect.InvocationHandler handler)
{
super(&Parameters);
this.handler = handler;
// 被代理类到代理类方向的变量同步
sync(null, false);
}
Java动态代理机制分析及扩展,第2部分(6)
时间:2011-06-21 IBM / 王忠平 何平
接下来介绍 sync 方法的实现,其思想就是首先获取被代理类的所有 Field 对象的列表,并通过扩展的调用处理器获得方法的声明类说对应的 stub 对象, 然后遍历 Field 对象列表并对各个变量进行拷贝同步。
清单 10. 声明在动态生成的代理类内部的 snyc 函数
private synchronized void sync(java.lang.Class clazz, boolean toStub)
{
// 判断是否为扩展调用处理器
if( handler instanceof InvocationHandlerEx )
{
java.lang.Class superClass = this.getClass ().getSuperclass();
java.lang.Class stubClass = ( clazz != null ? clazz : superClass );
// 通过扩展调用处理器获得stub对象
Object stub = ((InvocationHandlerEx)handler).getStub (stubClass);
if( stub != null )
{
// 获得所有需同步的类成员列表,遍历并同步
java.lang.reflect.Field[] fields = getFields (superClass);
for(int i=0; fields! =null&&i<fields.length; i++)
{
try
{
fields[i].setAccessible(true);
// 执行代理类和被代理类的变量同步
if(toStub)
{
fields[i].set(stub, fields[i].get (this));
}
else
{
fields[i].set(this, fields[i].get (stub));
}
}
catch(Throwable e)
{
}
}
}
}
}
Java动态代理机制分析及扩展,第2部分(7)
时间:2011-06-21 IBM / 王忠平 何平
这里涉及到一个用于获取类的所有 Field 对象列表的静态辅助方法 getFields。为了提高频繁查询时的性能,配合该静态方法的是一个静态的 fieldsMap 对象,用于记录已查询过的类其所包含的 Field 对象列表,使得再 次查询时能迅速返回其对应列表。相应的,类模板也需进行更新。
清单 11. 增加了静态 fieldsMap 变量后的类模板
package &Package;
final public class &Name &Extends &Implements
{
private static java.util.HashMap fieldsMap = new java.util.HashMap();
private java.lang.reflect.InvocationHandler handler = null;
&Constructors
&Methods
}
清单 12. 声明在动态生成的代理类内部的静态方法 getFields
private static java.lang.reflect.Field[] getFields (java.lang.Class c)
{
if( fieldsMap.containsKey(c) )
{
return (java.lang.reflect.Field[])fieldsMap.get(c);
}
java.lang.reflect.Field[] fields = null
|