Проблема при компиляции привет мирового класса с использованием Javassist

1

Я использую Javassist, чтобы написать класс HelloWorld с основным методом. Когда я компилирую, я получаю сообщение об ошибке, как показано ниже. Я не уверен, что неправильно с String [] args в основном методе?

javassist.CannotCompileException: [source error] syntax error near "ng[] args)"
at javassist.CtNewMethod.make(CtNewMethod.java:78)
at javassist.CtNewMethod.make(CtNewMethod.java:44) 

Это мой код

 public void createClass() {
    ClassPool cp = ClassPool.getDefault();
    CtClass ct = cp.makeClass("HelloClass");
    try {
        CtMethod m = CtNewMethod.make("public void sayHello() { System.out.println(\"Hello     World\");}",ct);
        ct.addMethod(m);

       String str="public static void main(String[] args)";
        CtMethod n = CtNewMethod.make(str,ct);
        n.setBody("HelloClass a = new HelloClass();a.sayHello();");
        ct.addMethod(n);
        ct.writeFile();

    } catch (CannotCompileException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


public static void main(String[] args) {
     JavaAssistExample inject = new JavaAssistExample();
    inject.createClass();

}
Теги:
javassist

1 ответ

2
Лучший ответ

Поскольку javadoc для состояний CtNewMethod

Исходный код должен включать не только тело метода, но и всю декларацию

Поэтому он должен содержать {}, например

String str = "public static void main(String[] args){}";

Однако еще две вещи дадут вам проблемы.

Во-первых, у вас нет конструктора по умолчанию (или без аргумента). Добавить один

ct.addConstructor(CtNewConstructor.defaultConstructor(ct));

Во-вторых, метод CtMethod#setBody(..) полностью заменяет тело метода. Поэтому вы не можете делать то, что делаете. Если вам нужны все эти звонки, вам нужно собрать их вместе

n.setBody("{HelloClass a = new HelloClass();a.sayHello();}");
  • 0
    Большое спасибо. Получил это работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню