java动态编译

来源:互联网 发布:淘宝批量充话费 编辑:程序博客网 时间:2024/05/22 15:04

简单来说,就是在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类加载机制

1 0
原创粉丝点击