Javassist:如何创建代理代理?

Boz*_*zho 9 java javassist

我正在用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(..)方法.所以第二个代理试图重新定义方法,而不是在子类中重写它.

Boz*_*zho 4

问题是(实际上,它与 CGLIB 相同 - 我使用 commons-proxy 尝试过)我不应该尝试创建代理类的代理类。第二个代理应该再次属于原始类。因此添加以下行可以解决问题:

if (instance instanceof ProxyObject) {
    originalClass = originalClass.getSuperclass();
}
Run Code Online (Sandbox Code Playgroud)

还有一个建议 - 如果您可以使用某种拦截器(例如 commons-proxy 中定义的拦截器),请使用它而不是使用多个代理。