Java 动态编译 简单了解

Java 跟Javax

  1. 通过以上解释可以很清晰的知道javax也是一个标准API的一部分,而不全部是代表了扩展的意思,而对于网上说的javax代表了j2ee这部分,其实这种说法是片名的,应该说是历史遗留的问题才更合适吧。java 是java j2sdk 中的类库,也就是Java Development kit 。 它提供也一些基础的东西,如io库、桌面程序的类库,如awt。集合库(如Collection、List、Map)等这些最基础的类库。

  2. javax是java的扩展包,如j2ee中的类库,包括servlet,jsp,ejb,数据库相关的一些东西,xml的等。

  3. 你可以参考下面的链接,一个是j2sdk API、一个是J2EE API一看,你就能更明白了。

  4. java和javax都是Java的API包,java是核心包,javax的x是extension的意思,也就是扩展包,它和java各有各的用处

Java 动态编译

  1. JDK6.0 后引入了动态编译机制。
  2. 动态编译场景, 浏览器上可以实现编写Java代码,然后上传到服务器编译跟运行,比如经常看到的 在线网页版Java 开发环境。

Java动态编译方法。

1. Runtime 调用javac 启动新进程执行操作。

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

2. 通过JavaCompiler 动态编译

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, null, null, "c:/HelloWorld.java"); // 执行 指定脚本下Java 代码

整体demo

package mytest;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * 测试java的动态编译
 * @author ljj
 *
 */
public class Client {
	public static void main(String[] args) throws Exception {

		// 通过IO流操作,将字符串存储成一个临时文件(Hi.java),然后调用动态编译方法!简单了解下
		String str = "public class Hi {public static void main(String[] args){System.out.println(\"HaHa,sowhat!\");}}";

		// 动态编译
		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
		int result = compiler.run(null, null, null, "c:/HelloWorld.java"); // 执行 指定脚本下Java 代码
		System.out.println(result==0 ? "编译成功":"编译失败");


		// 通过Runtime.getRuntime() 运行启动新进程执行 编译好的类
		Runtime run = Runtime.getRuntime();
        Process process = run.exec("java -cp  c:/    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:/")};
			URLClassLoader loader = new URLClassLoader(urls);
			Class c = loader.loadClass("HelloWorld");
			//调用加载类的main方法
			Method m = c.getMethod("main",String[].class);
			m.invoke(null, (Object)new String[]{});  //  因为是静态方法 所以不需要对象,传参的时候是数组 但是需要转化为 Object
			//由于可变参数是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();
		}
	}
}

参考

demo
动态编译

发布了443 篇原创文章 · 获赞 922 · 访问量 124万+

猜你喜欢

转载自blog.csdn.net/qq_31821675/article/details/103313962
今日推荐