【问题标题】:How to access super class members in Nashorn如何在 Nashorn 中访问超类成员
【发布时间】:2014-01-25 21:08:44
【问题描述】:

我正在尝试在 JavaScript 中扩展一个具体的 Java 类(来自 javafx 库的 TableCell),然后在超类上调用一个方法。我用 Rhino 引擎做这个没有问题,但它在 Nashorn 上失败了。我的代码是:

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

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

return cell;

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

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

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

return cell;

在填充相应的表视图时,这些 sn-ps 都会失败。 cell.super$setText throws 'null' has no such function "super$setText" 这让我觉得很奇怪,因为我已经粘贴了该方法的全部内容 - 封闭的 cell 变量应该不会变为 null。 Java.super(cell).setText 抛出“不能调用未定义。”

我还尝试了方便的属性语法cell.text = item,它似乎设置了一个新的 javascript 字段而没有抱怨,但没有在表格视图中显示文本。

我的 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 错误,还是我的来源有问题。这是正确的语法吗?我还想知道setText 不是在TableCell 上定义的,而是它的 超类之一是否重要。 nashorn 是否只能向上遍历层次结构?

【问题讨论】:

  • 我应该注意,fx.TableCell 被定义为fx.TableCell = Packages.javafx.scene.control.TableCell;

标签: java javascript inheritance nashorn


【解决方案1】:

Welp,这一切都开始了,因为我的表格显示了我所有的 TableCell,没有任何文本。我仍然有这个问题,但我已经消除了超类方法调用问题。

我创建了一个 Java 类,将所有必需的方法直接放在超类中,并在我的 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 在搜索超类方法时确实只向上移动了一级,并没有找到从继承链更上层继承的方法。

编辑

似乎我的挫败感变得草率了。在我上面的解决方案中,我只创建了一次新的扩展类,并且在第一次调用 fx.EditableTableCell 构造函数时在它关闭的单元格上设置了文本之后就在那里。这最终将我表格中的所有单元格留空。发生这种情况的原因是您可能在 updateItem 函数定义中使用 this.text = item。无论出于何种原因,您都必须有对该对象的外部引用,这导致我泄漏了 cell 变量并最终导致关闭问题。

回顾Java.superobj.super$methodName 都是访问直接在 Nashorn 中的 JavaAdapter 的超类上定义的方法的好方法,而且没有人真正掌握过闭包。

【讨论】:

  • 当然可以。我还有 20 个小时要等到我有能力。
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 2013-03-10
  • 2022-11-30
  • 2013-01-09
  • 2012-09-15
  • 2016-05-21
  • 2017-07-20
  • 1970-01-01
相关资源
最近更新 更多