0

考虑以下类声明:

class A{
    private String x;
    public A(String x) {
            this.x = x;
    }
}

当我尝试使用 javassist 使用以下代码为 A 类创建代理时:

ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(A.class);
MethodHandler mh = new MethodHandler() {...};
A a = (A) factory.create(new Class<?>[0], new String(){"hello"}, mh);

然后我得到了java.lang.RuntimeException: java.lang.NoSuchMethodException: app.test.A_$$_javassist_0.<init>()

为什么 javassist 不根据传递给 create 方法的第二个参数的参数类型使用正确的构造函数实例化类 A?

4

2 回答 2

4

通过传递new Class<?>[0],您是在告诉工厂调用无参数构造函数。尝试:

factory.create(new Class<?>[] { String.class }, new String[]{ "hello" }, mh);
于 2015-03-15T18:07:09.360 回答
2

您可以将最后一条语句替换为:

Class proxyKlass = factory.createClass();
Constructor<T> ctor = proxyKlass.getConstructor(String.class);
T res = ctor.newInstance(new String(){"hello"});
((Proxy) res).setHandler(handler);
于 2013-03-18T17:00:48.603 回答