• 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;
        }
    }

  • 相关阅读:
    Win7+Ubuntu11.10(EasyBCD硬盘安装)
    hdu 3661 Assignments
    hdu 1128 Self Numbers
    CF 152 B. Chilly Willy
    hdu 1754 I Hate It
    A survey of wireless network simulation and/or emulation software for use in higher education
    How to Fix Packet Loss: Causes, Simple Solutions & Top Tools
    getchar函数
    C++“左值”和“右值”
    stdio.h中的stdio
  • 原文地址:https://www.cnblogs.com/lee0oo0/p/2708188.html
Copyright © 2020-2023  润新知