【发布时间】:2020-04-07 12:20:10
【问题描述】:
我正在尝试做一些棘手的事情。我有方法 ObjectFactory.getObject(),它返回一个需要实现Serializable 的Object。我正在尝试为已经存在的ObjectFactory 实例创建代理,拦截其方法getObject(),然后将返回的对象包装到实现Serializable 的代理。
@Override
public Object get(String name, ObjectFactory<?> objectFactory) {
...
ObjectFactory<?> serializableObjectFactory = (ObjectFactory<?>)Proxy.newProxyInstance(CurrentClass.class.getClassLoader(), new Class[]{ObjectFactory.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//Here I'm getting StackOverflow exception. I guess, it just invokes itself recursively. Don't know why
Object result = ((ObjectFactory<?>) proxy).getObject();
//Here I make object implement Serializable
return Mixin.create(new Class[]{Serializable.class, result.getClass()}, new Object[] {result});
}
});
...
return super.get(name, serializableObjectFactory);
}
当代码到达Object result = ((ObjectFactory<?>) proxy).getObject() 时,它似乎只是递归地调用自己(我得到StackOverflow 异常),我不知道为什么。
我有两个无法确定的猜测:
- 我以错误的方式使用代理。不过我查了一下,好像没问题。
- 方法
invoke()中的对象代理作为代理提供,因此它可能会在无限循环中调用自身。除了Advise,我没有找到如何将此代理解包为真实对象,但它不适合此代理。
你有什么猜测吗?
【问题讨论】:
标签: java spring proxy cglib dynamic-proxy