JAVA动态编译

 

JAVA 6.0引入了动态编译机制

动态编译应用场景:

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

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

 

动态编译的两种做法:

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

        Runtime run = Runtime.getRuntime();

        Process process = run.exec(“javac -cp d:/myjava/ HelloWorld.java”);

——通过JavaCompiler动态编译

        Public static compilerFile(String[] args){

//动态编译

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

Int result = compiler.run(null,null,sourceFiler);

System.out.printin(result==0?”编译成功”:”编译失败”);

return result;

}

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

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

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

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

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

 

JAVA动态编译_第1张图片

 

import javax.tools.JavaCompiler;

import javax.tools.ToolProvider;

 

publicclass Dome3 {

    publicstaticvoid main(String[] args) {

       JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

       int result = compiler.run(null,null, null, "D:/myJava/HelloWorld.java");

       System.out.println(result==0?"编译成功":"编译失败");

    }

}

 

JAVA动态编译_第2张图片

 

动态动行编译好的类

通过Runtime.getRuntime()运行启动新的进程运行

Runtime run = Runtime.getRuntime();

Process process = run.exec(“java -cp”+dir+” ”+classFile);

通过反射运行程序,调用程序中的main方法

Public static void runJavaClassByReflec(String dir,String classFile)throws Execption{

   try{

       URL[] urls = new URL[]{new URL(“file:/”+dir)};

       URLClassLoader loader  = new URLClassLoader(urls);

       Class c = loader.loaerClass(classFile);

       //调用加载类的main方法

       c.getMethod(“main”,String[]class).invoke(null,(Object)new String[]{});

}cath(Exception e){

   e.printStackTrace();

}

}


通过Runtime动态编译

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

 

import javax.tools.JavaCompiler;

import javax.tools.ToolProvider;

 

publicclass Dome3 {

    publicstaticvoid main(String[] args) throws IOException {

       // 通过IO操作将字符串存储成一个临时文件(SayHi.java),然后调用动态编译方法。

       String str = "public class SayHi{public static void main(String[] args){System.out.print(\"sayhi\");}}";

 

       JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

       int result = compiler

              .run(null, null, null, "D:/myJava/HelloWorld.java");

       System.out.println(result == 0 ? "编译成功" : "编译失败");

       

       Runtime run = Runtime.getRuntime();

       Process process = run.exec("java -cp D:/myJava  HelloWorld");

       InputStream in = process.getInputStream();

       BufferedReader reader = new BufferedReader(new InputStreamReader(in));

        String info = "";

        while((info=reader.readLine())!=null){

            System.out.println(info);

        }

    }

}

 

编译成功

Hello  World


通过反射调用main方法

import java.io.IOException;

 

import java.net.URL;

import java.net.URLClassLoader;

@SuppressWarnings("all")

publicclass Dome3 {

 

    publicstaticvoid main(String[] args) throws IOException {

       try {

           URL[] urls = new URL[] { new URL("file:/" + "D:/myJava/") };

           URLClassLoader loader = new URLClassLoader(urls);

           Class c = loader.loadClass("HelloWorld");

           // 调用加载类的main方法

           c.getMethod("main", String[].class).invoke(null,

                  (Object) new String[] {});

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

}

Hello  World  


import java.io.File;

import java.io.PrintWriter;

import java.lang.reflect.Method;

import java.net.URL;

import java.net.URLClassLoader;

import java.util.Scanner;

 

publicclass Dome5 {

    publicstaticvoid main(String[] args) throws Exception {  

       //创建文件路径

       File file = new File("d:/myJava");

       if(!file.isDirectory()){

           file.mkdirs();

       }

       //创建文件

       File fi = new File(file,"Dome5.java");

       if(!fi.exists()){

           fi.createNewFile();

       }

       //将类写进文件中

       PrintWriter write = new PrintWriter("d:/myJava/Dome5.java");

       write.write("public class Dome{ public static void main(String[] args){ SYstem.out.print(\"HelloWorld!\")}}");

       write.flush();

       write.close();

        // 动态运行文件中的类

       URL[] urls = new URL[]{new URL("file:/"+"d:/myJava/")};

       URLClassLoader loader = new URLClassLoader(urls);

       Class clas = loader.loadClass("HelloWorld");

       Method m1 = clas.getMethod("main", String[].class);

       m1.invoke(null, (Object)new String[]{});

       System.out.println("========================");

       //读取文件中的类

       Scanner in = new Scanner("d:/myJava/Dome5.java");

       while(in.hasNext()){

           System.out.println(in.next());

       }

       in.close();

    }

}

你可能感兴趣的:(JAVA动态编译)