求助:如何在Rhino JavaScript中实现含3个带参方法的Java接口?
在Rhino中实现Java多方法接口的正确方式
你遇到的问题是因为Rhino JavaScript引擎不支持直接用对象字面量的语法来实现Java接口——这和Java的匿名内部类写法不一样,得用Rhino专门提供的JavaAdapter工具来创建接口的实现类。
错误原因分析
你原来的代码尝试直接用new javax.xml.namespace.NamespaceContext() {...}来实现接口,这在Rhino里是行不通的,因为Rhino无法自动把JS对象映射为Java接口实例,必须通过JavaAdapter显式声明要实现的接口。
正确的实现代码
把你的代码改成下面这样就能正常工作了:
var xPath = javax.xml.xpath.XPathFactory.newInstance().newXPath(); // 使用JavaAdapter来实现NamespaceContext接口 var namespaceContext = new JavaAdapter(javax.xml.namespace.NamespaceContext, { getNamespaceURI: function(prefix) { if (prefix === 'media') { return "http://search.yahoo.com/mrss/"; } return null; }, getPrefix: function(namespaceURI) { return null; }, getPrefixes: function(namespaceURI) { return null; } }); xPath.setNamespaceContext(namespaceContext);
关键要点说明
JavaAdapter是Rhino的核心API,第一个参数是要实现的Java接口(或要继承的类),第二个参数是包含接口方法实现的JS对象。- 要确保JS对象里的方法名和Java接口的方法名完全一致(大小写敏感),比如
getNamespaceURI不能写成getnamespaceuri,否则Rhino会认为你没有实现接口的方法。 - 方法的参数和返回值要符合Java接口的定义:比如
getNamespaceURI接收String类型的prefix,返回String类型的URI,你的逻辑是正确的,不需要修改。
这样修改后,你的NamespaceContext实现就能被XPath实例正确识别,处理带media前缀的命名空间了。
内容的提问来源于stack exchange,提问作者Vova Prigozhanov
相关产品推荐
相关产品推荐

