zoukankan      html  css  js  c++  java
  • Java 动态编译

    http://www.java2s.com/Tutorial/Java/0120__Development/CompileString.htm

    import java.lang.reflect.Method;
    import java.net.URI;
    import java.util.Iterator;
    import java.util.NoSuchElementException;

    import javax.tools.JavaCompiler;
    import javax.tools.JavaFileObject;
    import javax.tools.SimpleJavaFileObject;
    import javax.tools.ToolProvider;

    public class CompileString {
      public static void main(String[] argsthrows Exception {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        String program = "class Test{" "   public static void main (String [] args){"
            "      System.out.println (\"Hello, World\");"
            "      System.out.println (args.length);" "   }" "}";

        Iterable<? extends JavaFileObject> fileObjects;
        fileObjects = getJavaSourceFromString(program);

        compiler.getTask(null, null, null, null, null, fileObjects).call();

        Class<?> clazz = Class.forName("Test");
        Method m = clazz.getMethod("main"new Class[] { String[].class });
        Object[] _args = new Object[] { new String[0] };
        m.invoke(null, _args);
      }

      static Iterable<JavaSourceFromString> getJavaSourceFromString(String code) {
        final JavaSourceFromString jsfs;
        jsfs = new JavaSourceFromString("code", code);
        return new Iterable<JavaSourceFromString>() {
          public Iterator<JavaSourceFromString> iterator() {
            return new Iterator<JavaSourceFromString>() {
              boolean isNext = true;

              public boolean hasNext() {
                return isNext;
              }

              public JavaSourceFromString next() {
                if (!isNext)
                  throw new NoSuchElementException();
                isNext = false;
                return jsfs;
              }

              public void remove() {
                throw new UnsupportedOperationException();
              }
            };
          }
        };
      }
    }

    class JavaSourceFromString extends SimpleJavaFileObject {
      final String code;

      JavaSourceFromString(String name, String code) {
        super(URI.create("string:///" + name.replace('.''/'+ Kind.SOURCE.extension), Kind.SOURCE);
        this.code = code;
      }

      public CharSequence getCharContent(boolean ignoreEncodingErrors) {
        return code;
      }
    }

    http://www.java2s.com/Tutorial/Java/0120__Development/CompileJavafile.htm

    import javax.tools.Diagnostic;
    import javax.tools.DiagnosticCollector;
    import javax.tools.JavaCompiler;
    import javax.tools.JavaFileObject;
    import javax.tools.StandardJavaFileManager;
    import javax.tools.ToolProvider;

    public class CompileFiles2 {
      public static void main(String[] args) {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        DiagnosticCollector<JavaFileObject> dc;
        dc = new DiagnosticCollector<JavaFileObject>();

        StandardJavaFileManager sjfm;
        sjfm = compiler.getStandardFileManager(dc, null, null);

        Iterable<? extends JavaFileObject> fileObjects;
        fileObjects = sjfm.getJavaFileObjects(args);

        compiler.getTask(null, sjfm, dc, null, null, fileObjects).call();

        for (Diagnostic d : dc.getDiagnostics()) {
          System.out.println(d.getMessage(null));
          System.out.printf("Line number = %d\n", d.getLineNumber());
          System.out.printf("File = %s\n", d.getSource());
        }
      }
    }

    张旋(zxsoft)
    如对本文有什么疑问,请在下面写下留言,谢谢!

  • 相关阅读:
    聊聊高并发系统之限流特技
    Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
    密码技术(图解密码技术的学习总结)
    Nginx配置
    Nginx与浏览器缓存
    JAVA类加载和初始化
    [TimLinux] JavaScript 模态框可拖动功能实现——节流版
    [TimLinux] JavaScript 模态框可拖动功能实现——原始版
    [TimLinux] Python3 Coverity zeep/SOAP 库使用示例
    [TimLinux] Vue.js -- Day02 -- 第一个示例
  • 原文地址:https://www.cnblogs.com/zxsoft/p/1724682.html
Copyright © 2011-2022 走看看