java - 动态编译和执行代码的直接标准输出

标签 java compilation dynamic-code

背景信息:

  • 我使用 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() 时,它工作正常。但我想从执行中获取标准输出和标准错误结果并将它们保存在变量中,以便我可以将它们作为结果返回。

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

最佳答案

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

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

关于java - 动态编译和执行代码的直接标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30533875/

相关文章:

java - HttpURLConnection : What is the right way to read data from a WebService, 逐字符还是逐行?

warnings - 如果取消未使用的变量警告,保持所有其他变量不变

scala - SBT编译与compileIncremental之间的区别

c# - 将一个对象放在 ILGenerator 中的堆栈顶部

java - 获取区域开始键和结束键-HBase

java - 如何避免 ConcurrentModificationException

gcc - 从源代码编译miniupnpc

visual-studio - 如何在Visual Studio中突出显示动态代码

java - Pusher 连接 - socketId 为 null