js调用java静态方法_如何从JavaScript调用Java实例的方法?

当一个java方法(无论是静态的还是非静态的)作为范围内的全局函数可用时,我们使用以下逻辑:

FunctionObject javascriptFunction = new FunctionObject(/* String*/ javascriptFunctionName, /* Method */ javaMethod, /*Scriptable */ parentScope);

boundScope.put(javascriptFunctionName, boundScope, javascriptFunction);

这里boundScope应该始终是使函数可用的范围.

但是,父作用域的值取决于我们是绑定实例方法还是静态方法.在静态方法的情况下,它可以是任何有意义的范围.它甚至可以与boundScope相同.

但是在实例方法的情况下,parentScope应该是其方法被绑定的实例.

以上只是背景信息.现在我将解释问题是什么,并为它提供一个自然的解决方案,即允许直接调用实例方法作为全局函数,而不是显式创建对象的实例,然后使用该实例调用方法.

调用函数时,Rhino调用FunctionObject.call()方法,该方法传递对此的引用.如果函数是一个全局函数,则调用它而不引用它(即xxx()而不是this.xxx()),传递给FunctionObject.call()方法的this变量的值是调用的范围(即在这种情况下,此参数的值将与scope参数的值相同).

如果调用的java方法是一个实例方法,这就成了一个问题,因为根据FunctionObject类的构造函数的JavaDocs:

如果该方法不是静态的,那么Java这个值将对应于JavaScript这个值.任何使用不具有正确Java类型的值调用该函数的尝试都将导致错误.

在上面描述的场景中就是这种情况. javascript此值与java此值不对应,并导致不兼容的对象错误.

解决方案是继承FunctionObje

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值