java - 如何从类加载器加载的 jar 中获取系统输出控制台?

标签 java system.out

我正在运行这样的外部 jar 插件:

  Class<?> pluginClass = pluginLoader.loadClass(".......");     
  Method main = pluginClass.getMethod("main", String[].class);
  main.invoke(null, new Object[] { new String[0] }); 

效果很好。现在需要将插件控制台消息保存到一个字符串中

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  PrintStream ps = new PrintStream(baos); // how to indicate System.out coming from JAR plugin 
  System.setOut(ps); 
 // how to connect ps with plugin only 

但此代码将所有控制台消息保存到字符串中。我不需要所有应用程序消息。如何重定向仅限插件消息......来自这个加载的jar的消息到字符串中?

最佳答案

你不能按照你的要求去做。进程中只有一个标准输出流,它与插件代码和您的代码共享。

您可以改为将插件代码作为单独的进程运行并捕获输出流。您可以使用“java.home”系统属性来查找启动进程的 JRE 的位置,并使用它来形成命令行来启动插件 jar。

参见 https://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html

关于java - 如何从类加载器加载的 jar 中获取系统输出控制台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57937898/

相关文章:

java - 如何记住登录谷歌帐户 Android

java - 如何验证 SWT 表单?

java - 需要将输出从多线程套接字服务器重定向到其他客户端。

java - 在 Android Studio 中加载 Mapbox map 后绘制标记 [Java]

java - 检查一个数字是否可以从两个整数列表中求和的最快方法?

java - 小java程序打印不可见的换行符?

Java 代码用户输入 System.out

Java System.out.println() 一个数组

java - 是什么导致我的循环仅在第一次迭代中忽略此 "\t"?

java - 使用静态导入和使用 QueryDSL 创建新的 q 类型实例有什么区别?