2013-03-18 5 views
0

Рассмотрим следующее объявление класса:Почему метод create Javassist ProxyFactory не вызывает правильный конструктор на основе параметра args?

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

Когда я пытаюсь создать прокси-сервер для класса А с Javassist со следующим кодом:

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 не создает экземпляр класса A, используя правильный конструктор, основанный на типе параметров второго аргумента, переданного методу create?

ответ

1

Вы можете заменить последнее заявление:

Class proxyKlass = factory.createClass(); 
Constructor<T> ctor = proxyKlass.getConstructor(String.class); 
T res = ctor.newInstance(new String(){"hello"}); 
((Proxy) res).setHandler(handler); 
+1

Да Я понимаю ваш подход, но почему метод 'create'' ProxyFactory' не соответствует тому же решению? – rollaeriu360

2

Пропустив new Class<?>[0], вы сообщаете завод назвать не-арг конструктор. Попробуйте:

factory.create(new Class<?>[] { String.class }, new String[]{ "hello" }, mh);