js使用java对象_javascript-通过JS中的函数引用对java对象的Na...

我想将本机Java对象放入ScriptEngine绑定中,以便于访问.

scriptEngine.put("myApi", myApiInstance);

这里的“ myApiInstance”具有一个非静态方法“ foo()”.

现在在JS中我有一个功能:

someJsFunction(func) { func.call(...) }

但是电话

someJsFunction(myApiInstance.foo)

结果为“ TypeError:func.call不是函数”.

另一方面,“ myApiInstance.foo()”可以按预期工作.

看起来像ScripEngine的细节,因为“ call()”方法应该在任何函数中都可用.

是的,“ typeof myApiInstance.foo”返回“ function”

最佳答案

Java方法和函数接口对象(lambda对象)被视为脚本函数,因此可以照常从JavaScript调用.正如您在此类对象上提到的“ typeof”会返回true.您可以直接从脚本中调用它们.但是就这些没有其原型为Function.prototype的意义而言,这些不是真正的JS函数对象.就是说,如果您想使用Function.prototype.call或.apply来调用它们,[例如,您正在分派给任何传递的可调用对象],则可以执行以下操作:

import javax.script.*;

public class Main {

public static void main(String[] args) throws Exception {

ScriptEngineManager m = new ScriptEngineManager();

ScriptEngine e = m.getEngineByName("nashorn");

// get the java static method to call

e.eval("var getProp = java.lang.System.getProperty");

// direct call

e.eval("print(getProp('java.home'))");

// call using Function.prototype.call

e.eval("print(Function.prototype.call.call(getProp, null, 'java.home'))");

// a java object

e.eval("var out = java.lang.System.out");

// get an instance method

e.eval("var p = out.println");

// call java instance method using Function.prototype.call

e.eval("Function.prototype.call.call(p, out, 'hello world')");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值