当前位置: 首页 > 知识库问答 >
问题:

从Nashorn获得扩展Java课程

咸皓
2023-03-14

有没有办法从JavaScript(Nashorn)中获取和使用扩展Java类?

我试图做的是在Nashorn中扩展一个Java类,然后将其传递回Java。例如,我们在JS中定义了一个类来扩展另一个类:

var SomeClass= Java.type("com.test.SomeClass");
var MySomeClass = Java.extend(SomeClass, {
    aMethod1: function() {
        print("m1");
    },
    aMethod2: function() {
        print("m2");
    },
}); 

然后我试图得到这个扩展的对象在Java像这样:对象我的东西类=scriptEngine.get("我的东西类");

然而,我无法在Java中对此对象进行任何方法调用。当我试图将其转换为基类时,它总是抛出异常。测验SomeClass。

是否可以在Java中使用在Nashorn(JS)中创建的扩展类?

共有1个答案

公良奇
2023-03-14

这是一个扩展ArrayList的工作示例:

String script = "(function() {\n" +
  "  var ArrayList = Java.type('java.util.ArrayList')\n" +
  "  var ArrayListExtender = Java.extend(ArrayList)\n" +
  "  var list = new ArrayListExtender() {\n" +
  "    get: function(idx) {\n" +
  "      return idx >= list.size() ? " +
  "'no such value' : Java.super(list).get(idx);\n" +
  "    }\n" +
  "  }\n" +
  "  return list;\n" +
  "} ());";

  ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
  @SuppressWarnings("unchecked")
  List<String> result = (List<String>) engine.eval(script);
  result.add("gotcha");
  System.out.println(result.get(0));
  System.out.println(result.get(10));

您没有说明您得到了什么异常,但问题可能在于您如何使用或使用该类型。请注意,无论是Java.type还是Java.extend返回java.lang.类——这些方法返回带有未记录API的内部Nashorn类型。

 类似资料:
  • 我试图使用graal nashorn interop来编写与Java交互的NodeJ。我从。但我不能延长课程。javascript代码是 我的错误是这似乎指向了我所引用的java代码以及javascript运行位置的类加载器问题(即两个不同的类加载器)。在使用graal/nodejs时,有没有办法做到这一点?

  • 问题内容: 这实际上是我现在面临的问题。我有一个类,可以说该类定义了一个返回实例的方法。该类在内部定义并声明。我想要做的就是定义一个类扩展,但我也想对与加入我自己的功能(方法,属性等)。我也想回来。 问题是最终的。这是我想做的事的例证: 我想做的是: 我该如何实现? [编辑]我正在向我的问题添加更多详细信息。我实际上是在为Jenkins开发一个插件,经过搜索,我意识到有一个插件提供了我想做的基本功

  • 第十二课:OpenGL扩展 扩展 GPU的性能随着更新换代一直在提高,支持渲染更多的三角形和像素点。然而,原始性能不是我们唯一关心的。NVIDIA, AMD和Intel也通过增加功能来改善他们的显卡。来看一些例子。 ARB_fragment_program 回溯到2002年,GPU都没有顶点着色器或片断着色器:所有的一切都硬编码在芯片中。这被称为固定功能流水线(Fixed-Function Pip

  • 问题内容: 我想从 MimeType* 获取 扩展名 。 * 例如: 要将文件保存在Windows或Linux上,我可以使用这种方法从URL下载文件。因此,我只能保存它而没有扩展名(我不想要那样)。 这种方法只允许我获取 MimeType 而不是 扩展名 。 如何使用MimeType编写带有扩展名的文件? 问题答案: 通常有两种方法: 具有MimeTypes到扩展名的映射; 使用某种逻辑进行计算;

  • 我想从一个mimetype中得到扩展。 例如: 为了在Windows或Linux上保存我的文件,我有一个方法,让我从URL下载文件。所以,我只能在没有扩展的情况下保存它(我不想那样)。 这个方法只允许我获取MimeType,而不是扩展。 如何使用MimeType编写扩展名的文件?

  • 问题内容: 我怎样才能做到这一点: 另外,我想知道这种方法是否可行,因为我已经在类中创建了菜单,即ControlMenu,并且在其他活动中继续进行扩展。 问题答案: 你只能扩展一个类。并从许多来源实现接口。 扩展多个类不可用。我能想到的唯一解决方案不是继承任何一个类,而是每个类都有一个内部变量,并通过将对你对象的请求重定向到你希望它们去的对象来做更多的代理。 这是我想出的最好的解决方案。你可以从这