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

我正在运行一个外部 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 的消息重定向到字符串中?


吃鸡游戏
浏览 118回答 3
3回答

慕尼黑5688855

你不能做你所要求的。该进程中只有一个标准输出流,它与插件代码和您的代码共享。您可以将插件代码作为单独的进程运行并捕获输出流。您可以使用“java.home”系统属性查找启动进程的 JRE 的位置,并使用它形成命令行来启动插件 jar。

一只萌萌小番薯

System.out 是每个进程的,每个类加载器不可能有不同的流。如果您迫切需要让系统从插件中退出,有两种选择: 1. 如果您有权访问插件的代码,则将输出流传递给您的插件,并使插件使用此流。2. 将插件作为外部进程运行。这样您就可以重定向其输出。另一种选择:如果您可以区分插件输出,您可以实现自己的路由输出流并将其设置为系统输出。

慕神8447489

我做了这个解决方法:public class CustomPrintStream extends PrintStream {&nbsp; &nbsp; private String prefix;&nbsp; &nbsp; public CustomPrintStream(String prefix, OutputStream out) {&nbsp; &nbsp; &nbsp; &nbsp; super(out);&nbsp; &nbsp; &nbsp; &nbsp; this.prefix = prefix;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void println(String s) {&nbsp; &nbsp; &nbsp; &nbsp; if(s.startsWith(prefix))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; super.println(s);&nbsp; &nbsp; &nbsp; &nbsp; else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(s);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.setOut(this);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}这使您可以向每个主程序的 System.out.printlns 添加前缀,以便它们正常执行。没有前缀的(来自您的插件)直接进入定义的输出流(在我的示例中为文件输出流)它的使用方式如下:System.setOut(new CustomPrintStream("test", new FileOutputStream("C:\\out.txt"))); //Of course you can also use ByteArrayOutputStream, as you did beforeSystem.out.println("test 1"); //this goes into the standard outstreamSystem.out.println("2"); //and this goes into the fileoutputstreamSystem.out.println("test 3");也许这会对你有帮助:)编辑:我将其切换,以便带有前缀的字符串进入正常的输出
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java