0

我正在寻找一种方法来拦截从 JavaScript(Rhino/Java)到任何和所有 Java 对象(Java 方法)的所有方法调用。

我想要:

  • 计算它们(按方法名称和参数)
  • 如果不允许该方法,则能够抛出异常

Rhino-Engine 内部有办法解决这个问题吗?

我知道还有其他选项,例如面向方面的编程库,但我想避免这些。

我也尝试替换NativeJavaMethodRhino 引擎中的实现,但它与系统绑定得很深,无法替换。

如果只有一个工厂(比如 ContextFactory),那就太好了。

或类似的方法调用拦截器ContextFactory.doTopCall(...),但适用于所有 JS-2-Java 调用。

4

2 回答 2

0

我找到了Rhino ClassShutter 替代品:SandboxShutter,看起来很有希望。

于 2016-10-24T14:15:49.387 回答
0

如果您只想拦截对 Java 对象方法的调用,那么这是可能的。通过在初始化上下文工厂(大多数情况下是全局上下文工厂)时覆盖上下文工厂的 makeContext 方法来覆盖上下文对象的创建。

覆盖上下文中的包装工厂并覆盖 wrapAsJavaObject 方法并返回 NativeJavaObject 的匿名实现,该实现覆盖 get() 和 put() 方法。每次放置某些东西(如属性或方法)时,检查它是否为 FieldAndMethods。创建一个从 FieldAndMethods 扩展并包装它的新类(包含),通过将原始对象传递给构造函数并放置此实例而不是原始实例来创建此类的实例。

新类应覆盖 call() 方法以进行拦截。并且只需调用包含的对象调用方法。

如果您需要示例代码,请告诉我。

于 2018-04-13T08:19:37.800 回答