1、ant javac 的原理
sun.tools包下包含了很多命令的java实现,javac的使用见下例:
//sun.tools.javac.Main 该类负责实现javac命令,推荐使用反射方式创建该类实例(ant中就是用的反射)。
sun.tools.javac.Main compiler =
new sun.tools.javac.Main(System.err, "javac");
//编译后的class文件保存的地址
File dest=new File("classes");
dest.mkdir();
//开始编译,参数是执行javac命令是后面所根的参数,注意javac命令后参数以空格分隔,在此使用一个字符串数组保存。
compiler.compile(new String[]{"-classpath",".","-sourcepath",new File("temp").getAbsolutePath(),"-d","classes",""});
2、动态加载类
通过上面的方法动态的编译java类,在程序中使用的时候还需要进行加载。
所有的java类都是通过ClassLoader的对象来加载。在此可以使用其子类URLClassLoader加载:
//使用当前项目的路径为根路径
File baseDir=new File("");
URL url=new URL("file:/"+baseDir.getAbsolutePath()+"/classes/");
//通过指定class文件的路径告诉ClassLoader从何加载类
URLClassLoader loader=URLClassLoader.newInstance(new URL[]{url},ClassLoader.getSystemClassLoader());
//加载类,返回该类得Class实例。效果同Class.forName()。
clazz=loader.loadClass("org.jigger.Simple");
注意:使用自定义ClassLoader,无法使用Class.forName获取类对象,即无法使用系统类加载器加载该类