简单来说,就是在java代码中实现java文件的编译运行喽,如果出现NullPointerException,请参见配置tools.jar
具体有啥用呢,比如java动态代理,它要生成临时的代理类吧,就这么加载。
package com.diyun;
import java.io.File;
import java.io.IOException;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import org.apache.commons.io.FileUtils;
public class Test3{
public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException {
final String rt="\r\t"; //换行符
/**
* 生成java文件内容
*/
final String code=
"package com.diyun;"+rt+
"import java.util.Arrays;"+rt+
"public class Demo {"+rt+
" public static void main(String[] args){"+rt+
" char[] hellos=\"Hello World\".toCharArray();"+rt+
" System.out.println(Arrays.toString(hellos));"+rt+
" }"+rt+
"}";
String filePath=System.getProperty("user.dir"); //获取当前工作目录
String fileName=filePath+"/Demo.java"; //文件名
File file=new File(fileName);
FileUtils.writeStringToFile(file,code); //commoms-io工具包
//获取编译器,也就是传说中命令行中的“javac”!
JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();
//获取文件管理器
StandardJavaFileManager manager=
compiler.getStandardFileManager(null, null, null);
//获取文件
Iterable units = manager.getJavaFileObjects(fileName);
//创建编译任务
CompilationTask task = compiler.getTask(null, manager, null,null,null,units);
//进行编译
task.call();
manager.close();
//获取类加载器
ClassLoader loader=ClassLoader.getSystemClassLoader();
Class c=loader.loadClass("com.diyun.Demo");
c.newInstance();
}
}
丢半拉子代码放这里,留与以后研究研究,从这上面多多少少能看出一点java类加载机制