无限循环和StackOverflow与代理的关系

问题描述 投票:1回答:1

我想做棘手的事。我有方法ObjectFactory.getObject() 其中返回一个 Object 需要实施的 Serializable. 我想为一个已经存在的 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 例外),我也不知道为什么。

我有两个猜测,我不能确定。

  1. 我使用代理服务器的方式不对 但我检查了一下,似乎没有问题。
  2. 方法中的对象代理 invoke() 作为一个代理,所以它可能会无休止地循环调用自己。我没有找到如何将这个代理解包成一个真正的对象,除了用 Advise但它不适合这个代理。

你能猜到是哪里出了问题吗?

java spring proxy cglib dynamic-proxy
1个回答
0
投票

让我们来看看这一行。

Object result = ((ObjectFactory<?>) proxy).getObject();

你觉得会发生什么?

  1. 它调用了代理。
  2. 代理调用了你的InvocationHandler。
  3. 回到步骤1。

也许调用 objectFactory 而不是?

© www.soinside.com 2019 - 2024. All rights reserved.