第三篇 java的动态编译

动态编译的应用场景:

  可以做一个在浏览器端编写java代码,上传服务器编译和运行的在线评测系统

  服务器动态加载某些类文件进行编译

动态编译的两种做法:

  通过runtime调用javac,启动新的进程去操作

  Runtime run = Runtime.getRuntime();

  Process process = run.exec("javac -cp d:/myjava/Hello.java");

 1 public class Demo02 {
 2     public static void main(String[] args) throws IOException {
 3         //通过IO流操作,将字符串存储为一个临时文件(hi.java),然后调用动态编译方法
 4                 String str = "public class hi{public static void main(String[] args){"
 5                         + "System.out.println('hi')}}";
 6                 //动态编译
 7                 JavaCompiler JavaCompiler = ToolProvider.getSystemJavaCompiler();
 8                 //sourceFile文件的路径
 9                 int result = JavaCompiler.run(null, null, null, "c:/java/Hello.java");
10                 System.out.println(result == 0?"编译成功":"编译失败");
11                 
12                 Runtime run = Runtime.getRuntime();
13                 Process process = run.exec("javac -cp c:/java Hello.java");
14                 InputStream in = process.getInputStream();
15                 BufferedReader reader = new BufferedReader(new InputStreamReader(in));
16                 String info = reader.readLine();
17                 while(info != null){
18                     System.out.println(info);
19                 }
20     }
21 }

 

  通过javaCompiler动态编译

1 public static int compileFile(String sourceFile){
2         //动态编译
3         JavaCompiler JavaCompiler = ToolProvider.getSystemJavaCompiler();
4         int result = JavaCompiler.run(null, null, null, sourceFile);
5         System.out.println(result == 0?"编译成功":"编译失败");
6         return result;
7     }

第一个参数:为java编译器提供参数

第二个参数:得到java编译器的输出信息

第三个参数:接收编译器的错误信息

第四个参数:可变参数(是一个string数组)能传入一个或者多个源文件

返回值:0表示编译成功,非0表示编译失败

 

通过反射进行动态编译

 

 1 public class Demo02 {
 2     public static void main(String[] args) throws Exception {
 3         //通过IO流操作,将字符串存储为一个临时文件(hi.java),然后调用动态编译方法
 4                 String str = "public class hi{public static void main(String[] args){"
 5                         + "System.out.println('hi')}}";
 6                 //动态编译
 7                 JavaCompiler JavaCompiler = ToolProvider.getSystemJavaCompiler();
 8                 //sourceFile文件的路径
 9                 int result = JavaCompiler.run(null, null, null, "c:/java/Hello.java");
10                 System.out.println(result == 0?"编译成功":"编译失败");
11                 
12                 //通过runtime调用类
13                 /*Runtime run = Runtime.getRuntime();
14                 Process process = run.exec("javac -cp c:/java Hello.java");
15                 InputStream in = process.getInputStream();
16                 BufferedReader reader = new BufferedReader(new InputStreamReader(in));
17                 String info = reader.readLine();
18                 while(info != null){
19                     System.out.println(info);
20                 }*/
21                 URL[] urls = new URL[]{
22                         new URL("file:/"+"c:/java/")
23                 };
24                 URLClassLoader loader = new URLClassLoader(urls);
25                 Class c = loader.loadClass("Hello");
26                 //调用加载类的main方法
27                 Method method = c.getMethod("main", String[].class);
28                 //参数的个数是可以变的,加object进行转型
29                 method.invoke(null,(Object)new String[]{});
30     }
31 }

 

转载于:https://www.cnblogs.com/zhangzhipeng001/p/9123822.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值