我正在用javassist创建代理ProxyFactory.创建单个代理时,一切正常.
但是,当我将代理对象传递给代理机制时,它会失败
javassist.bytecode.DuplicateMemberException:重复方法:com.mypackage.Bean中的setHandler _ $$ _ 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();
}
Run Code Online (Sandbox Code Playgroud)
那么,我如何创建代理的代理?
更新:实际问题是每个代理实现了ProxyObject定义setHandler(..)方法.所以第二个代理试图重新定义方法,而不是在子类中重写它.
问题是(实际上,它与 CGLIB 相同 - 我使用 commons-proxy 尝试过)我不应该尝试创建代理类的代理类。第二个代理应该再次属于原始类。因此添加以下行可以解决问题:
if (instance instanceof ProxyObject) {
originalClass = originalClass.getSuperclass();
}
Run Code Online (Sandbox Code Playgroud)
还有一个建议 - 如果您可以使用某种拦截器(例如 commons-proxy 中定义的拦截器),请使用它而不是使用多个代理。