gpt4 book ai didi

java - jjs.exe 和 ServiceLoader

转载 作者:行者123 更新时间:2023-11-30 07:05:24 28 4
gpt4 key购买 nike

jjs.exe 运行的脚本是否应该能够像任何 Java 程序一样使用 ServiceLoader 定位服务?

我已将案例简化为以下脚本:

function dump (stream)
{
(new BufferedReader(new InputStreamReader(stream))).lines().forEach(function (x) { print(x); });
}

var BufferedReader = Java.type("java.io.BufferedReader");
var InputStreamReader = Java.type("java.io.InputStreamReader");
var ServiceLoader = Java.type("java.util.ServiceLoader");

var Sts = Java.type("prodist.sts.Sts");
print(Sts);
// A

var stsConfigStream = Sts.class.getResourceAsStream("/META-INF/services/prodist.sts.Sts");
dump(stsConfigStream);
// B

var StsImpl = Java.type("prodist.sts.internal.StsImpl");
print(new StsImpl());
// C

var stsLoader = ServiceLoader.load(Sts.class);
var stsIterator = stsLoader.iterator();
stsIterator.next();
// D

我调用jjs.exe在命令行上设置类路径。我的脚本正确找到并打印了A点的接口(interface)名称。它找到了服务描述资源;当我转储资源的内容时,我在 B 点看到了预期的内容。我确保预期的实现类在 C 点可用。

在 D 点,程序抛出 NoSuchElementException,我将其解释为 ServiceLoader 未找到该接口(interface)的任何服务描述资源。

这应该有效吗?我错过了什么吗?

最佳答案

您需要设置线程上下文类加载器。引用 jjs 类路径中的任何类,获取它的 Class 对象,然后获取它的类加载器。然后将该加载器设置为线程上下文类加载器。这应该在使用服务加载器 API 之前完成:

var StsClass = Java.type("prodist.sts.Sts").class;
java.lang.Thread.currentThread().contextClassLoader = StsClass.classLoader;

关于java - jjs.exe 和 ServiceLoader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40227657/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com