java - 如何在 Nashorn 中访问 super 类成员

标签 java javascript inheritance nashorn

我试图在 JavaScript 中扩展一个具体的 Java 类(来自 javafx 库的 TableCell),然后调用父类(super class)的方法。我使用 Rhino 引擎执行此操作没有问题,但在 Nashorn 上却失败了。我的代码是:

var Cell = Java.extend(fx.TableCell);

var cell = new Cell() {
  updateItem: function (item, isEmpty) {
    if(!isEmpty){
     cell.super$setText(item);
    }
  }
};

return cell;

除了上面的“super$setText”语法之外,该语法早在 August 中就添加到了 nashorn 中。 ,我已经尝试了 Accessing Methods of a Superclass 中提到的 Java.super 调用。在 nashorn 指南中:

var Cell = Java.extend(fx.TableCell);

var cell = new Cell() {
  updateItem: function (item, isEmpty) {
    if(!isEmpty){
     Java.super(cell).setText(item);
    }
  }
};

return cell;

当填充相应的 TableView 时,这些代码片段都会失败。 cell.super$setText 抛出 'null' 没有这样的函数“super$setText” 这让我觉得很奇怪,因为我已经粘贴了该方法的全部内容 - 封闭的 cell 变量不应该变成 null。 Java.super(cell).setText 抛出“无法调用未定义。”

我还尝试了方便的属性语法 cell.text = item ,它似乎设置了一个新的 javascript 字段而没有提示,但不执行任何操作来在 TableView 中显示文本。

我的 JDK8 版本是最近的

C:\> java -version  
java version "1.8.0-ea"  
Java(TM) SE Runtime Environment (build 1.8.0-ea-b124)  
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b66, mixed mode)

我无法辨别这是 nashorn bug 还是我的源代码问题。这是正确的语法吗?我还想知道 setText 不是在 TableCell 上定义的,而是在其父类(super class)之一上定义是否重要。 nashorn 只能遍历层次结构上一级吗?

最佳答案

好吧,这一切都开始了,因为我的表格显示了我的所有 TableCells,没有任何文本。我仍然有这个问题,但我已经消除了父类(super class)方法调用问题。

我创建了一个 Java 类,将所有必需的方法直接放置在父类(super class)中,并在 JavaScript 中使用它。类源码如下:

public class JsTextTableCell<S,T> extends javafx.scene.control.TableCell<S, T> {

    public void setText(Object text){
        System.out.println("In java, calling setText(" + text.toString() + ")");
        super.setText(text.toString());
    }
}

然后我将 JavaScript 更改为:

fx.EditableTextTableCell = function () {
  var cell;
  if(!fx.EditableTextTableCell.Class) {
    fx.EditableTextTableCell.Class = Java.extend(fx.JsTextTableCell, {
      updateItem: function (item, isEmpty) {
        if(!isEmpty){
          cell.super$setText(item);
        }
      }
    });
  }

  cell = new fx.EditableTextTableCell.Class();

  return cell;
};

这段代码运行很好。事实上,Java.supercell.super$setText 方法都可以工作。我的表格仍然拒绝显示我的文本,但这完全是另一个问题。因此看来 Nashorn 在搜索父类(super class)方法时确实只向上移动了一层,并且没有找到从继承链中更上层继承的方法。

编辑

看来我在沮丧中变得马虎了。在上面的解决方案中,我仅创建一次新的扩展类,并且在第一次调用 fx.EditableTableCell 构造函数时关闭的单元格上设置文本后。这最终会使我的表格中的所有单元格留空。发生这种情况的原因是您可能在 updateItem 函数定义中使用 this.text = item。无论出于何种原因,您都必须拥有对该对象的外部引用,这导致我泄漏了 cell 变量并最终导致了闭包问题。

回顾一下:Java.superobj.super$methodName 都是访问直接在 Nashorn 中 JavaAdapter 父类(super class)上定义的方法的好方法,而且没有人真正掌握了闭包。

关于java - 如何在 Nashorn 中访问 super 类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21356273/

相关文章:

java - Android应用程序: RecyclerView hangs when I put around 300 records from API in it at one go

java - 将 firebase 添加到应用程序时出现 appcompat 依赖项错误

javascript - 将外部 HTML 加载到 DIV 中

javascript - 当父 div 返回 false 时,文件输入的默认操作消失

c# - 如果我的类不继承任何东西,为什么我能够覆盖 Equals 方法?

java - Android开发中是否需要对输入参数进行服务器端(Web服务)验证?

javascript - Jquery选择插件来发布值,按照用户在多个框中选择数据的顺序

c++ - 对 C++ 中的构造函数链感到困惑

scala - 构造函数(特征)不能应用于(类扩展特征)

java - 如何在主 Activity 中访问 PreferenceActivity 的 onDestroy() ?