我正在使用java提供的接口从程序中调用编译器。
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromStrings(Arrays.asList("MyClass.java"));
compiler.getTask(null, fileManager, null, null, null, compilationUnits).call();
fileManager.close();
一切工作正常,但我想要做的是将变量传递给我正在编译的项目,并比较结果以查看它们是否符合预期,所以我的程序无法正常工作。有点像 JUnit 测试类的方式。 JavaCompiler 接口中是否有方法允许您传入变量并读取它们...类似
System.in()
和 System.out()
?
运行(Java)程序与编译它没有太大关系。要么动态加载已编译的类并运行它们(例如在新线程中),要么使用
ProcessBuilder
启动新的 VM,基本上构建一个像“java -cp /class/path my.compiled.MainClass ...
”这样的命令行。后者可能是首选,因为被测试的程序不会通过 System.exit()
意外终止您的程序。
当然有一个更好的解决方案:为什么不以编程方式生成一些 JUnit 测试(并调用 JUnit)?