Бесконечный l oop и StackOverflow с прокси - PullRequest
1 голос
/ 07 апреля 2020

Я пытаюсь сделать сложную вещь. У меня есть метод O bjectFactory.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() поставляется как прокси, поэтому он может вызывать себя в бесконечном l oop. Я не нашел, как развернуть этот прокси в реальный объект, кроме Advise, но он не подходит этому прокси.

У вас есть какие-нибудь догадки, что не так?

...