public class Test01 {
public static void main(String[] args) throws IOException {
String str = "public class HiHi{\n" +
"\tpublic static void main(String[] args) {\n" +
"\t\tSystem.out.println(\"HiHi\");\t\n" +
"\t}\n" +
"}";
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("C:\\Users\\ma\\Desktop\\HiHi.java"));
bufferedWriter.write(str);
bufferedWriter.close();
JavaCompiler systemJavaCompiler = ToolProvider.getSystemJavaCompiler();
int result = systemJavaCompiler.run(null, null, null, "C:\\Users\\ma\\Desktop\\HiHi.java");
System.out.println(result == 0 ? "编译成功" : "编译失败");
//通过
/*Runtime run = Runtime.getRuntime();
Process process = run.exec("java -cp C:\\Users\\ma\\Desktop\\ HiHi");
InputStream inputStream = process.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String str1;
while ((str=bufferedReader.readLine()) != null) {
System.out.println("---" + str);
}*/
try {
URL[] urls = new URL[]{new URL("file:/"+"C:\\Users\\ma\\Desktop\\")};
URLClassLoader loader = new URLClassLoader(urls);
Class c = loader.loadClass("HiHi");
//调用加载器类的main方法
Method m = c.getMethod("main",String[].class);
m.invoke(null,(Object)new String[]{"aa","bb"});
//由于可变参数是JDK5.0之后才有,上面代码会编译成:m.invoke(null,"aa","bb"),就发生类参数个数不匹配的问题.
//因此,必须要加上(Object)转型,避免这个问题
//public static void main(String[] args)
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
Java 动态编译 + 反射机制配合使用
最新推荐文章于 2022-11-22 09:28:03 发布