java动态编译

针对于java sdk1.6的版本对于java动态编译类的实现:

 

import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Arrays;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;


public class CompileString {
    public static void main(String[] args) throws Exception {
        //通过系统工具提供者获得动态编译器
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        //获得一个文件管理器,它的功能主要是提供所有文件操作的规则,
       
//如源代码路径、编译的classpath,class文件目标目录等,其相关属性都提供默认值
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(nullnullnull);

        StringObject so = new StringObject("demo.CalculatorTest", "package demo;" +
                "  class CalculatorTest {" +
                "    public int multiply(int multiplicand, int multiplier) {" +
                "        System.out.println(multiplicand);" +
                "        System.out.println(multiplier);" +
                "        return multiplicand * multiplier;" +
                "    }" +
                "}");

        JavaFileObject file = so;
        // 指定 javac 的命令行参数
        
//
 注意:最好将编译后的.class文件放到当前JVM实例的类路径上,否则加载不鸟
//        Iterable options = Arrays.asList("-d", "E:\\workspace\\hellosbt\\target\\scala-2.9.1\\classes");
        Iterable options = Arrays.asList("-d", "E:\\workplace\\javacompiletest\\bin");
        // 指定有哪些源文件需要被编译
        Iterable<? extends JavaFileObject> files = Arrays.asList(file);
        

//返回编译对象
        JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, null, options, null, files);

//执行此编译任务 

        Boolean result = task.call();
       
        if (result) {
            System.out.println("编译成功");

    //返回类的名字的对应的引用 

            Class<?> clazz = Class.forName("CalculatorTest");
    //Class 对象所表示的类的一个新实例
            Object instance = clazz.newInstance();
    //返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
            Method m = clazz.getMethod("multiply", new Class[]{int.classint.class});
    //对应传入相应的参数
            Object[] o = new Object[]{1, 2};
            m.invoke(instance, o);
        }
    }
}

class StringObject extends SimpleJavaFileObject {
    private String contents = null;

    public StringObject(String className, String contents) throws Exception {
        //Kind.SOURCE表示用 Java 编程语言编写的源文件
super(new URI(className), Kind.SOURCE);
        this.contents = contents;
    }

    public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
        return contents;
    }
}

posted on 2012-09-29 10:59  lee0oo0  阅读(324)  评论(0编辑  收藏  举报