Было бы легко с Byte Buddy, но если вы должны использовать «облегченный» (мое соединение загружает 3 МБ менее чем за 100 миллисекунд), то вот как вы это сделаете:
ProxyFactory factory = new ProxyFactory();
factory .setSuperclass(BigInteger.class);
factory .setFilter(new MethodFilter() {
@Override
public boolean isHandled(Method m) {
return !m.getName().equals("finalize");
}
});
Class<?> clazz = factory.createClass();
MethodHandler handler = new MethodHandler() {
private volatile Object delegate;
@Override
public Object invoke(Object self, Method method, Method proceed,
Object[] args) throws Throwable {
Object delegate = this.delegate;
if (delegate == null) {
synchronized (this) {
delegate = this.delegate;
if (delegate == null) {
this.delegate = delegate = loadObject();
}
}
}
return method.invoke(delegate, args);
}
private Object loadObject() throws Exception {
// expensive computation here
long totalCount = getTotalCount(totalCountExecutors);
return BigInteger.valueOf(totalCount);
}
};
BigInteger instance = (BigInteger) clazz.newInstance();
((Proxy) instance).setHandler(handler);
Сделайте однакообратите внимание, что Javassist сталкивается с собственными проблемами с модульной системой, и вам может понадобиться еще одна миграция в будущем.