首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

动态编译运作java文件

2013-03-13 
动态编译运行java文件动态生成,编译,运行java文件,jdk动态代理底层实现就是利用此方法,demo已上传。package

动态编译运行java文件
动态生成,编译,运行java文件,jdk动态代理底层实现就是利用此方法,demo已上传。

package com.code.test;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.net.MalformedURLException;import java.net.URL;import java.net.URLClassLoader;import javax.tools.JavaCompiler;import javax.tools.JavaCompiler.CompilationTask;import javax.tools.JavaFileObject;import javax.tools.StandardJavaFileManager;import javax.tools.ToolProvider;public class CodeGenerate {/** * 编译java类 * @param writerPath */public void javac(String writerPath){//java编译器JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();//文件管理器,参数1:diagnosticListener  监听器,监听编译过程中出现的错误StandardJavaFileManager manager = compiler.getStandardFileManager(null, null, null);//java文件转换到java对象,可以是多个文件Iterable<? extends JavaFileObject> it = manager.getJavaFileObjects(writerPath);//编译任务,可以编译多个文件CompilationTask t = compiler.getTask(null, manager, null, null, null, it);//执行任务t.call();try {manager.close();} catch (IOException e) {e.printStackTrace();}}/** * 利用反射,实例化对象,此方法可指定class路径,放在classpath下可能会和jdk编译的文件冲突 * @param packPath */public void java(String packPath){URL[] urls = null;try {//类路径,url的本地文件格式需要加file:/urls = new URL[] {new URL("file:/"+System.getProperty("user.dir")+"/src/")};} catch (MalformedURLException e) {e.printStackTrace();}//类加载器URLClassLoader url = new URLClassLoader(urls);Class clazz = null;try {//加载到内存clazz = url.loadClass(packPath);//实例化对象clazz.newInstance();} catch (Exception e) {e.printStackTrace();}}/** * 读文件 * @param readerPath * @return */public BufferedReader fileReader(String readerPath){BufferedReader br = null;try {br = new BufferedReader(new FileReader(readerPath));} catch (FileNotFoundException e) {e.printStackTrace();}return br;}/** * 写文件 * @param br * @param writerPath */public void fileWriter(BufferedReader br,String writerPath){String line;BufferedWriter bw = null;try {line = br.readLine();bw = new BufferedWriter(new FileWriter(writerPath));while(line != null){bw.write(line+"\r\n");line = br.readLine();}} catch (IOException e) {e.printStackTrace();} finally {try {br.close();} catch (IOException e) {e.printStackTrace();} finally {try {bw.flush();bw.close();} catch (IOException e) {e.printStackTrace();}}}}}package com.code.test;import java.io.BufferedReader;/** * 测试类,注:eclipse设置中  运行环境设置为jdk,如果设置为jre无法编译成功。 * @author Administrator * */public class CodeTest  { //文件读取路径private static final String READER_PATH = System.getProperty("user.dir")+"/codeFile/codeText.txt";//文件输出路径private static final String WRITER_PATH = System.getProperty("user.dir")+"/src/com/code/java/CodeText.java";//包路径private static final String PACK_PATH = "com.code.java.CodeText";public static void main(String[] args) {CodeGenerate code = new CodeGenerate();//读文本文件BufferedReader br = code.fileReader(READER_PATH);//生成java类code.fileWriter(br, WRITER_PATH);//编译java类code.javac(WRITER_PATH);//运行java类code.java(PACK_PATH);}}; package com.code.java;/** *  * txt文件中的动态类 * */public class CodeText  {     public CodeText() {     System.out.println("代码生成并且编译运行成功!");    }     };

热点排行