参考:使用 javax.tools 创建动态应用程序
javax.tools 包是一种添加到 Java SE 6 的标准 API,可以实现 Java 源代码编译,使您能够添加动态功能来扩展静态应用程序。本文将探查javax.tools包中提供的主要类,以Java表达式表示计算一个数值函数y=x*x+x。更多详情请参考《使用 javax.tools 创建动态应用程序》和javax.tools API docs
。
complier.CharSequenceCompiler源码:
package complier;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardLocation;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;
/**
* 编译{@link CharSequence}形式的源码,并实例化,返回一个实例。
* 用法示例(以编译MyInterface的一个实现类为例):
*
*
* MyInterface instance = null;
* JavaStringCompiler compiler = new JavaStringCompiler(null, null);
* try {
* Class newClass = compiler.compile("com.mypackage.NewClass",
* stringContaininSourceForNewClass, new Class>[] { MyInterface.class });
* instance = newClass.newInstance();
* } catch (JavaStringCompilerException ex) {
* ex.printStackTrace();
* } catch (IllegalAccessException ex) {
* ex.printStackTrace();
* }
* instance.someOperation(someArgs);
*
*/
public class CharSequenceCompiler {
/** 真正使用的编译器 */
private final JavaCompiler compiler;
private final ClassLoaderImpl classLoader;
/** 保存编译器编译中的诊断信息 */
private DiagnosticCollector diagnostics;
private final FileManagerImpl javaFileManager;
/** 编译参数 */
private final List options;
/**
* 构造一个新的实例,该实例持有指定的classloader
*
* @param loader
*