一、java文件的动态编译
javac命令是调用“JAVA_HOME/lib/tools.jar”中的“com.sun.tools.javac.Main”的compile方法来编译:
public static int compile(String as[]);
public static int compile(String as[], PrintWriter printwriter);
返回0表示编译成功,字符串数组as则是我们用javac命令编译时的参数,以空格划分。例如:
javac -classpath c:\foo\bar.jar;. -d c:\ c:\Some.java
则字符串数组as为
{"-classpath","c:\\foo\\bar.jar;.","-d","c:\\","c:\\Some.java"},如果带有PrintWriter参数,则会把编译信息出到这个指定的printWriter中。默认的输出是System.err。
二、class文件的动态加载
假如想加载G:\\temp下的Model.class,则
URLClassLoader loader=new URLClassLoader(new URL[]{new URL("file:G:\\temp\\")});
Object model=loader.loadClass("Model").newInstance();
注意,当前的classpath中不能含有Model.class(例如当前classpath为d:/test/),否则用于加载该Model的加载器是系统加载器(这是由类加载的委托机制决定的)。假如Model实现了java.util.List接口,则可以在当前程序中List list=(List) loader.loadClass("Model").newInstance()实例化,当打印list的ClassLoader时,返回的是URLClassLoader。