【问题标题】:Endless loop and StackOverflow with a proxy带有代理的无限循环和 StackOverflow
【发布时间】:2020-04-07 12:20:10
【问题描述】:

我正在尝试做一些棘手的事情。我有方法 ObjectFactory.getObject(),它返回一个需要实现SerializableObject。我正在尝试为已经存在的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&lt;?&gt;) proxy).getObject() 时,它似乎只是递归地调用自己(我得到StackOverflow 异常),我不知道为什么。

我有两个无法确定的猜测:

  1. 我以错误的方式使用代理。不过我查了一下,好像没问题。
  2. 方法invoke() 中的对象代理作为代理提供,因此它可能会在无限循环中调用自身。除了Advise,我没有找到如何将此代理解包为真实对象,但它不适合此代理。

你有什么猜测吗?

【问题讨论】:

    标签: java spring proxy cglib dynamic-proxy


    【解决方案1】:

    让我们看看这一行:

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

    你认为会发生什么?

    1. 它调用代理。
    2. 代理调用您的 InvocationHandler。
    3. 返回步骤 1。

    也许改为调用objectFactory 上的方法?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 2021-04-29
      • 1970-01-01
      相关资源
      最近更新 更多