我正在做一个非常大量地使用javax.script.*包的项目。我有一种情况,我想创建扩展抽象Java类的JavaScript对象,就像您可以使用Invocable.getInterface来创建实现Java接口的JavaScript对象一样。这可能吗?如果是,你是怎么做的?
是的,你可以;之前的海报是错误的。请参阅JavaAdapter的文档。
除非你想在运行时生成字节码(如下所示使用BCEL),否则不行。你可以使用代理类的接口来实现这一点,但抽象类没有等效的方法。
如果你真的想尝试BCEL,你最好的策略是这样做:
- 编写一个方法,使用BCEL为一个新类生成字节码的
byte[]
,该类扩展抽象类并将每个抽象方法委托给JavaScript - 定义一个将抽象类与包装器相关联的命名约定,例如
foo.MyAbstractClass
对应于foo.MyAbstractClassDynamicLangWrapper
- 滚动一个实现findClass的
ClassLoader
,以识别该命名约定并生成类字节并调用defineClass - 确保您的脚本语言使用自定义类加载器来解析脚本中的类名。我认为在Rhino中使用setApplicationClassLoader,但我不确定