拦截私有字段访问以进行延迟加载

时间:2012-03-02 17:42:47

标签: java reflection bytecode

我有一个框架,代表客户端加载任意类的实例,并希望字段(特别是私有字段)只有在首次访问字段时才能懒惰地初始化/加载。

有没有办法拦截这样的私有字段访问并在返回值之前将值注入字段(可能“缓存”它们)?

我猜java.lang.reflect.Proxy / InvocationHandler是排除在外的,因为它们只能拦截方法调用。

我有一种直觉,字节码操作库可以处理这个问题。我查看了ASM,Javassist,BCEL,cglib并搜索了所有内容,但未能找到有关如何实现此目的的明确说明。

1 个答案:

答案 0 :(得分:0)

使用ASM或类似框架的字节码检测肯定是可行的,但您必须了解字节码内部工作以及一些JVM内部。

更简单的方法是使用AspectJ并在对象上应用方面。关于Java对象的透明聚类,这个AOSD'07 paper中有一些类似的例子。