如何访问Nashorn中的超级成员

时间:2014-01-25 21:08:44

标签: java javascript inheritance nashorn

我试图在JavaScript中扩展一个具体的Java类(来自javafx libs的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;

除了上面的“super $ setText”语法(已添加到August中的nashorn)之外,我还尝试了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;

当填充相应的表视图时,这些片段都会失败。 cell.super$setText抛出'null' has no such function "super$setText"让我感到奇怪,因为我已经粘贴了方法的全部内容 - 封闭的cell变量无法变为空。 Java.super(cell).setText抛出“不能调用undefined。”

我还尝试了方便的属性语法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只能在层次结构中遍历一个级别吗?

1 个答案:

答案 0 :(得分: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超类上直接定义的方法的好方法,没有人真正掌握过闭包。