1

背景资料:

  • 我使用 javax.tools.JavaCompiler 将代码动态编译到内存中。
  • 我使用自定义类加载器来加载和执行动态编译的代码。

我的问题

假设有人提供以下代码:

package cs.compile;
import java.util.Arrays;
public class Foo {
    private static int[] nums = new int[] { 1, 2, 3, 4, 5 };
    public static void main(String[] args) {
        System.out.println(getWords() + " " + Arrays.toString(nums));
    }
    public static String getWords() { return "Hello World!!!"; }
}

当我通过反射执行 main() 时,它工作正常。但我想从执行中获取标准输出和标准错误结果并将它们保存在一个变量中,以便我可以将它们作为结果返回。

我不确定如何执行此操作,因为我认为,一旦加载了类,它与我的应用程序的其余部分共享相同的标准输出和标准错误。也许有一些标准的方法来处理这个问题?我不想将整个应用程序的输出流引开,但我不确定如何专门针对新类。

4

1 回答 1

1

由于正在编译它,因此您可以更改代码...替换System.out:)

或者,您可以根据一些启发式方法将全局 System.out 设置为重定向到不同目的地的自定义输出流。也许一些线程本地标志?等等

于 2015-05-29T16:02:39.320 回答