我正在使用Javassist用main方法编写HelloWorld类。当我编译时,我收到如下错误。我不确定main方法中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();
}
答案 0 :(得分:2)
作为CtNewMethod
状态的javadoc
源代码不仅必须包含方法体,还必须包括整个声明
因此必须包含{}
,例如
String str = "public static void main(String[] args){}";
然而,还有两件事会给你带来麻烦。
首先,您没有默认(或无参数)构造函数。添加一个
ct.addConstructor(CtNewConstructor.defaultConstructor(ct));
其次,CtMethod#setBody(..)
方法完全取代了方法体。所以你不能做你正在做的事情。如果你想要所有这些电话,你需要将它们放在一起
n.setBody("{HelloClass a = new HelloClass();a.sayHello();}");