善忘技术夹 Logo
善忘技术夹
技术文章 · 1622 阅读

使用Compiler API

使用Compiler API


/** 


 * 文件名: Compiler.java 


 * 


 * 版本信息:  v1.0


 * 日期: 2011-8-5 


 * Copyright:   Copyright(c) 2010


 * Corporation: 2011 


 * Company: 广州正道科技有限公司  


 */


package cn.sily.java6;




import java.io.File;


import java.lang.reflect.Method;


import java.net.URL;


import java.net.URLClassLoader;




import javax.tools.JavaCompiler;


import javax.tools.JavaCompiler.CompilationTask;


import javax.tools.StandardJavaFileManager;


import javax.tools.ToolProvider;






/** 


 * 名称: Compiler 


 * 描述:  动态编译文件,执行对应的方法


 * 创建人: sily


 * 创建时间: 2011-8-5 上午11:46:06


 * 修改人:


 * 修改时间:


 * 修改备注: 


 * @version 1.0


 */


public class Compiler {




public static void main(String[] args) {


try {


JavaCompiler jc = ToolProvider.getSystemJavaCompiler();




StandardJavaFileManager sjfm = jc.getStandardFileManager(null, null, null);




File file = new File("d:/我的桌面/cn/sily/java6/Hello.java");




Iterable fileObjects = sjfm.getJavaFileObjects(file);




CompilationTask ct = jc.getTask(null, sjfm, null, null, null, fileObjects);




ct.call();




sjfm.close();




//直接通过URLClassLoader


/**


 * 使用默认的委托父 ClassLoader 为指定的 URL 构造一个新 URLClassLoader。


 * 首先在父类加载器中搜索 URL,然后按照为类和资源指定的顺序搜索 URL。


 * 这里假定任何以 '/' 结束的 URL 都是指向目录的。如果不是以该字符结束,


 * 则认为该 URL 指向一个将根据需要下载和打开的 JAR 文件。 


 * 


 * 使用本地文件路径必须要用到file:/开头  URL才能找到资源


 * URL[] urls = new URL[]{new URL("file:/d:/我的桌面/")};


 *  <==>


 * File cfile= new File("d:/我的桌面/");


 * URL[] urls = new URL[]{cfile.toURL()};


 */




URL[] urls = new URL[]{new URL("file:/d:/我的桌面/")};


URLClassLoader urlc = new URLClassLoader(urls);


Class c = urlc.loadClass("cn.sily.java6.Hello");




//通过继承ClassLoader来动态加载类,路径可以是网络路径,本地文件路径


// MyClassLoader mycl = new MyClassLoader();


//
File cfile= new File("F:/myeclipseworkspace/myproject/src/cn/sily/java6/Hello.class");


// System.out.println(cfile.toURL());


//
Class c = mycl.loadClass(cfile.toURL().toString(),true);




 Object o = c.newInstance();


 


 Method m = o.getClass().getMethod("getHelloWorld", null);


 


 Object str = m.invoke(o, null);


 


 System.out.println(str);


 


} catch (Exception e) {


e.printStackTrace();


}


}


}


 



/** 

 * 文件名: Hello.java 

 * 

 * 版本信息:  v1.0

 * 日期: 2011-8-5 

 * Copyright:   Copyright(c) 2010

 * Corporation: 2011 

 * Company: 广州正道科技有限公司  

 */

package cn.sily.java6;


import java.util.Date;


/** 

 * 名称: Hello 

 * 描述: 

 * 创建人: sily

 * 创建时间: 2011-8-5 上午11:44:55

 * 修改人:

 * 修改时间:

 * 修改备注: 

 * @version 1.0

 */

public class Hello {


public String getHelloWorld(){

return "现在时间:" + new Date();

}

}