• 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)
    如对本文有什么疑问,请在下面写下留言,谢谢!

  • 相关阅读:
    golang json字符串合并操作
    goland 无法跳转 struct等
    golang 中mgo update报错: The dollar ($) prefixed field '$inc' in '$inc' is not valid for storage.
    解决windows下使用vscode没有函数提示的问题
    【转载,实测好用】gitlab结合sourcetree使用
    C++单继承、多继承情况下的虚函数表分析
    Linux 日志文件管理——限制大小
    C++ RCSP智能指针简单实现与应用
    Makefile模板(C++)
    Git关于pull,commit,push的总结
  • 原文地址:https://www.cnblogs.com/zxsoft/p/1724682.html
Copyright © 2020-2023  润新知