【发布时间】:2018-11-01 23:26:31
【问题描述】:
借助 cglib,我可以使用以下代码创建一个惰性实例化的 BigInteger:
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(BigInteger.class);
enhancer.setCallback(
new LazyLoader() {
@Override
public Object loadObject() throws Exception {
// expensive computation here
long totalCount = getTotalCount(totalCountExecutors);
return BigInteger.valueOf(totalCount);
}
});
totalCount =
(BigInteger)
enhancer.create(new Class[] {String.class}, new Object[] {"0"});
但是,上面的 Java 11 引发了警告,并且似乎没有兼容的版本正在制作中,所以我想迁移到其他库。 ByteBuddy 是...庞大的,并希望避免如此大的依赖。是否可以使用 javassist(或任何其他“轻量”库)创建延迟加载代理?
【问题讨论】:
-
您为什么要这样做?您可以懒惰地创建对象,而无需进行代理和类加载,尤其是考虑到您有 lambda,例如dzone.com/articles/be-lazy-with-java-8
-
@zapl 可能是因为他们需要将某个类型的延迟加载对象传递给库。
-
@ohlec 好的,但是代理并不是你不能用普通代码重新创建的魔法(除非它们做编译器不允许的事情),例如ideone.com/XK2GOH
-
我有一个 BigDecimal,它的计算成本很高,并且并非代码中的所有后续步骤都会使用(取决于太多因素)。 BigDecimal 没有无参数构造函数,因此不能选择通用代理。哦,但我看到你没有使用 Java 代理,而是创建一个子类......可以工作。
-
@zapl 基本上是一个手动创建的代理。当然,这是可能的,但它需要大量的样板文件。