动态编译JAVA代码并执行

Posted 周无极

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态编译JAVA代码并执行相关的知识,希望对你有一定的参考价值。

 

技术分享
package com.bjsxt.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Writer;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;

public class Test {
 public static void main(String[] args) throws IOException {
      //通过IO流操作,将字符串存储成一个临时文件(Hi.java),然后调用动态编译方法!  
       String str = "public class Hi {public static void main(String[] args){System.out.println(\"HaHa,sxt!\");}}";
       File file=new File("D://Hi.java");
       writeFile(file,str);
       JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        int result = compiler.run(null, null, null, "D://Hi.java");
        System.out.println(result==0?"编译成功":"编译失败");
        
        
        //通过Runtime调用执行类
      Runtime run = Runtime.getRuntime();  
      Process process = run.exec("java -cp  D://  Hi");  
    
     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();
      }    */

 
 }
 
 
 private static void writeFile(File file,String str) throws IOException {
     //1.定义字符输出流对象
     Writer fw=new FileWriter(file);
     BufferedWriter bw=new BufferedWriter(fw);
     
     //2.按行写入
     bw.write(str);
     bw.newLine();
     bw.write("//我爱你");
     bw.flush();
     
     //3.关闭流
     fw.close();
     System.out.println("写入成功");
     
 }
 
}
denamicCompile

 

以上是关于动态编译JAVA代码并执行的主要内容,如果未能解决你的问题,请参考以下文章

79 动态编译与动态运行

Python 代码动态执行初探

Unix中库的使用

java代码执行顺序

学习笔记 链接

Android 逆向Android 逆向通用工具开发 ( Android 平台运行的 cmd 程序类型 | Android 平台运行的 cmd 程序编译选项 | 编译 cmd 可执行程序 )(代码片段