首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jjs.exe和ServiceLoader

jjs.exe和ServiceLoader
EN

Stack Overflow用户
提问于 2016-10-24 21:13:23
回答 1查看 299关注 0票数 1

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

我已经将我的情况简化为以下脚本:

代码语言:javascript
复制
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点中的接口名,它定位了服务描述资源;当我转储资源的内容时,我在B点中看到了预期的内容。我确保预期的实现类在C点中可用。

在D点,程序抛出一个NoSuchElementException,我将其解释为ServiceLoader没有为接口找到任何服务描述资源。

这样能行吗?我是不是遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-26 08:08:01

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

代码语言:javascript
复制
var StsClass = Java.type("prodist.sts.Sts").class;
java.lang.Thread.currentThread().contextClassLoader = StsClass.classLoader;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40227657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档