Java 编程的动态性,第 8 部分: 用代码生成取代反射
2010-03-18 00:00:00 来源:WEB开发网下面是运行 ReflectAccess 的两个例子,用来展示结果:
[dennis]$ java -cp . ReflectAccess value1
Result values 1, 0
[dennis]$ java -cp . ReflectAccess value2
Result values 0, 1
构建 glue 类
我已经展示了反射版本的代码,现在要展示如何用生成的类来取代反射。要想让这种取代可以正确工作,会涉及到一个微妙的问题,它可追溯到本系列 第 1 部分中对类装载的讨论。这个问题是:我想要在运行时生成一个可从访问类的静态编译的代码进行访问的类,但是因为对编译器来说生成的类不存在,因此没办法直接引用它。
那么如何将静态编译的代码链接到生成的类呢?基本的解决方案是定义可以用静态编译的代码访问的基类或者接口,然后生成的类扩展这个基类或者实现这个接口。这样静态编译的代码就可以直接调用方法,即使方法只有到了运行时才能真正实现。
在清单 2 中,我定义了一个接口 IAccess ,目的是为生成的代码提供这种链接。这个接口包括三个方法。第一个方法只是设置要访问的目标对象。另外两个方法是用于访问一个 int 属性值的 get 和 set 方法的代理。
清单 2. 到 glue 类的接口
public interface IAccess
{
public void setTarget(Object target);
public int getValue();
public void setValue(int value);
}
这里的意图是让 IAccess 接口的生成实现提供调用目标类的相应 get 和 set 方法的代码。清单 3 显示了实现这个接口的一个例子,假定我希望访问 清单 1 中 HolderBean 类的 value1 属性:
清单 3. Glue 类示例实现
更多精彩
赞助商链接