为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

吃鸡游戏 2023-07-28 15:49:28
我正在运行一个外部 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 的消息重定向到字符串中?
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

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

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

查看完整回答
反对 回复 2023-07-28
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

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



查看完整回答
反对 回复 2023-07-28
?
慕神8447489

TA贡献1780条经验 获得超1个赞

我做了这个解决方法:


public class CustomPrintStream extends PrintStream {

    private String prefix;


    public CustomPrintStream(String prefix, OutputStream out) {

        super(out);

        this.prefix = prefix;

    }


    @Override

    public void println(String s) {

        if(s.startsWith(prefix))

            super.println(s);

        else {

            System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));

            System.out.println(s);

            System.setOut(this);

        }

    }

}

这使您可以向每个主程序的 System.out.printlns 添加前缀,以便它们正常执行。没有前缀的(来自您的插件)直接进入定义的输出流(在我的示例中为文件输出流)


它的使用方式如下:


System.setOut(new CustomPrintStream("test", new FileOutputStream("C:\\out.txt"))); //Of course you can also use ByteArrayOutputStream, as you did before

System.out.println("test 1"); //this goes into the standard outstream

System.out.println("2"); //and this goes into the fileoutputstream

System.out.println("test 3");

也许这会对你有帮助:)


编辑:我将其切换,以便带有前缀的字符串进入正常的输出


查看完整回答
反对 回复 2023-07-28
  • 3 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信