标签:main 动态 java String 编译 new null public
public class helloworld {
public static void main(String[] args) throws IOException {
//通过字符串动态编译:将字符串存储成一个临时文件(io流),然后调用动态编译方法
String str="public class Hi {public static void main(String[] args){System.out.println(\"HaHa,sxt!\");}}";
JavaCompiler compiler=ToolProvider.getSystemJavaCompiler(); //得到java的动态编译器
//如果第一个参数为空则使用控制台输入,第二个为空则使用控制台输出,第三个为空则使用系统报错
//第四个参数为String类型的可变参数,即相当于Sting类型的数组
int result=compiler.run(null, null, null,"C:\\Users\\10853\\eclipse-workspace\\lala\\src\\cn\\sxt\\in\\helloworld.java");
//返回值为0则表示编译成功,否则为失败
System.out.println(result==0?"编译成功":"编译失败");
//通过Runtime.getRuntime()运行编译好的类
Runtime run=Runtime.getRuntime();
Process process=run.exec("java -cp C:\\Users\\10853\\eclipse-workspace\\lala\\src\\cn\\sxt\\in helloworld");
InputStream in=process.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(in));
String info="";
while((info=reader.readLine())!=null)
{
System.out.println(info);
}
//通过反射运行编译好的类
try {
URL[] urls = new URL[] {new URL("file:/"+"C:/myjava/")};
URLClassLoader loader = new URLClassLoader(urls);
Class c = loader.loadClass("HelloWorld");
//调用加载类的main方法
Method m = c.getMethod("main",String[].class);
m.invoke(null, (Object)new String[]{});
//由于可变参数是JDK5.0之后才有。
//m.invoke(null, (Object)new String[]{});会编译成:m.invoke(null,"aa","bb"),就发生了参数个数不匹配的问题。
//因此,必须要加上(Object)转型,避免这个问题。
//public static void main(String[] args)
} catch (Exception e) {
e.printStackTrace();
}
}
}
标签:main,动态,java,String,编译,new,null,public 来源: https://blog.51cto.com/14437184/2437992
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。