文章目录
Java 跟Javax
-
通过以上解释可以很清晰的知道javax也是一个标准API的一部分,而不全部是代表了扩展的意思,而对于网上说的javax代表了j2ee这部分,其实这种说法是片名的,应该说是历史遗留的问题才更合适吧。java 是java j2sdk 中的类库,也就是Java Development kit 。 它提供也一些基础的东西,如io库、桌面程序的类库,如awt。集合库(如Collection、List、Map)等这些最基础的类库。
-
javax是java的扩展包,如j2ee中的类库,包括servlet,jsp,ejb,数据库相关的一些东西,xml的等。
-
java和javax都是Java的API包,java是核心包,javax的x是extension的意思,也就是扩展包,它和java各有各的用处。
Java 动态编译
- JDK6.0 后引入了动态编译机制。
- 动态编译场景, 浏览器上可以实现编写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();
}
}
}