【问题标题】:Can you extend Abstract Java Classes from JavaScript?你能从 JavaScript 扩展抽象 Java 类吗?
【发布时间】:2023-03-21 05:42:01
【问题描述】:

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

【问题讨论】:

    标签: java javascript rhino javax.script


    【解决方案1】:

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

    【讨论】:

    • 不幸的是,我在 javax.script 命名空间中使用了内置的东西,它不会暴露所有底层的 Rhino 对象。我的问题针对这种情况非常具体,但这仍然是一个有用的答案。
    • 其实这个是暴露在javascript端的,应该还是可以和javax.script一起工作的
    • 重要提示:JavaAdapter 的“文档”是个玩笑——链接页面上有一段,并且网络上的一些站点生成了几乎没有任何评论的 JavaDoc。 (那个实际上文档)。
    • JRE6+ 的 javax.script 包中默认提供的 JavaAdapter 对象不会让您在 javascript 中实现抽象类。只有接口可以使用 JavaAdapter 实现。见Java Scripting。不确定我是否同意 Oracle 的这一说法... > 使用 JavaAdapter 扩展 Java 类或实现 > 多个接口非常罕见。 ...扩展抽象类很少见?
    【解决方案2】:

    除非你想走在运行时生成字节码的路线(使用BCEL,如下所示),否则不会。您可以使用 proxy classes 对接口进行此操作,但抽象类没有等效项。

    如果你真的想尝试 BCEL,你最好的策略是这样做:

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

    【讨论】:

    • 这听起来很糟糕。如果是这样的话,我想我会想出另一个解决方案。
    • @Mike Samuel java 到 typescript 怎么样。我的意思是反之亦然。我正在开发一个实现一些 Java 本机功能的项目。最好的方法是什么?
    • @9me,你在 Rhino 中运行从 typescript 编译的 javascript 吗?
    • 没有。我有一个用java 编写的包,并使用一些内部java 类,即java.util.stream。现在我正在用打字稿重写那个包。我能够实现我的包逻辑,但是java.util.stream 我现在根本无法实现 java 类流类。所以我的问题是在我的情况下,最好的方法是什么?我正在尝试实现一些功能,但这还不够。谢谢
    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2011-06-15
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多