Я использую 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();
}
Поскольку 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();}");