Прямой стандартный вывод динамически скомпилированного и выполненного кода

Исходная информация:

  • Я использовал 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() через отражение, он работает нормально. Но я хотел бы получить результаты стандартных ошибок и стандартных ошибок при выполнении и сохранить их в переменной, чтобы я мог вернуть их в результате.

Я не уверен, как это сделать, так как я думаю, что после загрузки класса он использует те же стандартные ошибки и стандартные ошибки, что и остальная часть моего приложения. Возможно, есть какой-то стандартный способ борьбы с этим? Я не хочу направлять потоки вывода всего моего приложения, но я не уверен, как конкретно нацелиться на новый класс.

1 ответ

Поскольку вы его компилируете, вы можете изменить код... заменить System.out:)

Или вы можете установить глобальный System.out для пользовательского потока вывода, который перенаправляет в разные пункты назначения, основываясь на некоторой эвристике. Может быть, какой-нить локальный флаг? и т.п.

Другие вопросы по тегам