Java 动态代理机制分析及扩展,第 2 部分
2010-02-24 00:00:00 来源:WEB开发网清单 8. 更新后的方法模板(部分)
Object r = null;
try{
// 代理类到被代理类方向的变量同步
sync(&Class, true);
r = handler.invoke( this, method, &ParameterValues );
// 被代理类到代理类方向的变量同步
sync(&Class, false);
}&Exceptions
&Return
sync 方法还会在构造函数尾部被调用,从而将被代理类对象的变量信息同步到代理类对象,实现类似于拷贝构造的等价效果。相应的,构造函数模板也需要更新以支持该新特性。
清单 9. 更新后的构造函数模板
public &Name(java.lang.reflect.InvocationHandler handler)
{
super(&Parameters);
this.handler = handler;
// 被代理类到代理类方向的变量同步
sync(null, false);
}
接下来介绍 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)
{
}
}
}
}
}
更多精彩
赞助商链接