当前位置: 首页 > 面试题库 >

捕获Java中特定线程的控制台输出

丌官高远
2023-03-14
问题内容

我意识到在SO上也有类似的问题,但是它们并不能完全解决我的问题。

我想要一个给定Classhtml" target="_blank">对象的方法,该方法将在该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 :这将是线程安全的。其他线程可能会同时调用多个main方法,我希望每个线程仅捕获其自己的特定输出。


问题答案:

由于您使用的是main()方法-
您是否需要使它处于同一过程中?如果没有,您可以尝试将其创建为新的流程(java.lang.Process)。

Process类提供必要的方法来捕获StdOutStdErr和/或StdIn

注意
由于所有内容都在其自己的进程中运行,因此线程安全性应该没有问题。但是,您仍然必须找到该位置,.class文件(或至少是根目录)位于其中,以便您可以使用运行/创建流程java here.goes.your.ClassName



 类似资料:
  • 问题内容: 如果我有多个go例程,并且其中两个或两个以上例程决定需要打印某些内容,那么它们是否可能彼此中断? 例如: 是否有可能一个常规程序开始打印(),而另一个常规程序中断()和原始装订()? 我尝试自己运行它并检查输出,它 看起来 不错,但是如何确定? 问题答案: 是的,有可能,尽管GOMAXPROCS = 1不会显示任何内容。当使用更多goroutine,更大的行和更多的线程运行时,它们将显

  • 问题内容: 通过控制台进行任何输入的数据类型(如我使用BufferedReader类所做的那样)为String。之后,我们将其类型转换为需要查询的数据类型(如Inter.parseInt()为整数)。但是在C语言中,我们可以接受任何输入原始数据类型,而在Java中,所有输入类型都是Neccerily String。为什么是这样? 问题答案: 控制台输入实际上以一系列字节而不是字符串的形式读入。这是

  • 问题内容: 我一直在尝试从Java应用程序中检索“ unicode用户输入”,以获得一个小的实用程序片段。问题是,它似乎在“开箱即用”的Ubuntu上运行,我猜它在UTF-8上具有操作系统范围的编码,但是从“ cmd”运行时在Windows上不起作用。考虑的代码如下: 在Ubuntu上的输出(不对配置进行任何更改): 在Windows CMD提示符下输出(绝不受JAVA_TOOL_OPTIONS影

  • 我有一些多行文字作为控制台输入。诸如此类: 行数可能每次都不同(一、二、三、四等,但不是零),但这个文本总是在瞬间用行分隔符(一个粘贴,而不是按回车键输入几个)输入。这个Java应用程序必须立即开始对这些行做些什么,但出于某种原因,我不明白如何做出这种行为。我的意思是,它必须将所有这些行保存到,或,或

  • 问题内容: 程序应在中列出卷。 例如:我从vollist.java类获得此输出。 控制台输出: 如何在我的控制台中获得此控制台输出。 那只会显示row1-> vol1 row2-> vol1 ............如何获得类似于控制台row1-> vol1 row2-> vol2的输出(计数) 问题答案: 定义并实现您的TableModel(在这种情况下,扩展AbstractTableModel

  • 我对套接字和以这种方式使用线程相当陌生。 我遇到了一个问题,一个扫描器在等待用户输入,一个输入流阅读器在等待套接字通信。我的程序试图与客户机/服务器系统通信,这很好,但我也希望能够通过扫描仪或类似的东西直接将命令输入控制台。但是,主线程的while循环阻塞了套接字通信,而扫描器阻塞了InputThread的while循环。 我的问题是,如果我在控制台中发送命令关闭服务器(将布尔'running'设