Я понимаю, что есть похожие вопросы по SO, но они не совсем решают мою проблему.
Мне бы хотелось, чтобы метод, который, учитывая объект Class, вызывал метод "main", то есть public static void main, для этого класса (если он существует) и захватывал вывод консоли этого метода main. , Класс, выполняющий вызов, не является потоком демона.
У меня уже есть часть кода, но я не уверен, как захватить вывод консоли, и, кроме того, как захватить его только для * этого конкретного потока. Вот что у меня есть:
public class Output extends Thread {
private Class testClass;
public Output(Class clazz) {
this.testClass = clazz;
}
private Method getMainMethod(Class clazz) {
Method[] methods = clazz.getMethods();
for (Method method : methods) {
if (isMainMethod(method)) {
return method;
}
}
return null;
}
private Boolean isMainMethod(Method method) {
return (method.getName().equals("main") &&
Modifier.isStatic(method.getModifiers()) &&
method.getReturnType().equals(Void.class));
}
public void run() {
Method mainMethod = null;
if ((mainMethod = getMainMethod(this.testClass)) == null) {
//if there's no static void main method, throw exception
throw new YouFuckedItUpException();
}
mainMethod.invoke(this.testClass, new String[0]);
return heresWhereImStuckIWantToCaptureTheConsoleOutputAndReturnIt();
}
}
Все, что мне нужно, это некоторый код или ссылка на ответ о том, как захватить выходные данные System.out и System.err вызываемого метода. Буду очень признателен за любую помощь.
Заранее спасибо!
РЕДАКТИРОВАТЬ: Это не только для тестирования, это в конечном итоге будет что-то запущено в производство.
РЕДАКТИРОВАТЬ 2 : Это должно быть поточно-ориентированным. Несколько основных методов будут вызываться другими потоками, возможно, в одно и то же время, и я хочу, чтобы каждый поток записывал только свой собственный конкретный вывод.