你能从JavaScript扩展抽象Java类吗?

时间:2011-06-27 23:02:42

标签: java javascript rhino javax.script

我正在开发一个大量使用javax.script。*包的项目。我有一种情况,我想创建扩展Abstract Java类的JavaScript对象,就像你可以使用Invocable.getInterface来创建实现Java接口的JavaScript对象一样。这可能吗?如果是这样,你是怎么做到的?

2 个答案:

答案 0 :(得分:2)

是的,你可以;以前的海报是错的。请参阅documentation for JavaAdapter

答案 1 :(得分:0)

除非你想在运行时使用生成字节码的路径(使用BCEL如下),否则不行。你可以使用proxy classes的接口来完成它,但是没有抽象类的等价物。

如果您真的想尝试BCEL,那么您最好的策略是:

  1. 编写一个方法,使用BCEL为新类生成byte[]字节码,扩展抽象类并将每个抽象方法委托给JavaScript。
  2. 定义一个将抽象类与包装器相关联的命名约定,例如: foo.MyAbstractClass对应foo.MyAbstractClassDynamicLangWrapper
  3. 滚动实现findClassClassLoader以识别该命名约定并生成类字节并调用defineClass
  4. 确保您的脚本语言使用自定义类加载器来解析脚本中的类名。我认为你在Rhino中使用setApplicationClassLoader,但我不确定。