Я создаю прокси с javassist ProxyFactory
. При создании единственного прокси все хорошо работает.
Однако, когда я передаю объект прокси механизму проксирования, он перестал работать с
javassist.bytecode. DuplicateMemberException: повторяющийся метод: setHandler в com.mypackage. $$ Bean_ _javassist_0_ $$ _javassist_1
Я создаю прокси с этим:
public Object createProxiedInstance(Object originalInstance) throws Exception {
Class<?> originalClass = instance.getClass();
ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(originalClass);
factory.setHandler(new MethodHandler() {..});
Class<T> proxyClass = factory.createClass();
return proxyClass.newInstance();
}
Так, как я создаю прокси прокси?
Обновление: фактические проблемы состоят в том, что каждый прокси реализует ProxyObject
который определяет setHandler(..)
метод. Таким образом, 2-й прокси пытается переопределить метод, вместо того, чтобы переопределить его в подклассе.
Проблема заключалась (на самом деле, то же самое и с CGLIB - я пробовал использовать commons-proxy), что я не должен пытаться создать прокси-класс для прокси-класс. Второй прокси снова должен быть оригинального класса. Таким образом, добавление следующей строки решает проблему:
if (instance instanceof ProxyObject) {
originalClass = originalClass.getSuperclass();
}
И совет - если вы можете использовать какие-то перехватчики (например, определенные в commons-proxy), делайте это вместо использования нескольких прокси.