如何在Rhino中继承内部(静态)类?

时间:2011-01-01 00:34:50

标签: java javascript subclass rhino inner-classes

我正在尝试在Rhino中对一个内部类(在Java中定义)进行子类化,我似乎无法使其工作。

我有一些编译的Java代码(我基本上无法改变)有一个内部抽象类:

package mypackage;
class MyClass {
  abstract static class MyInnerClass {
    abstract void print(String s);
  }
}

从Rhino,我可以看到它很好:

js> Packages.mypackage.MyClass.MyInnerClass
[JavaClass mypackage.MyClass$MyInnerClass]

但我无法弄清楚如何将其子类化。我认为这样的东西会起作用,因为我是为非内部类做的:

var a = new JavaAdapter(Packages.mypackage.MyClass.MyInnerClass, {
  print: function(s) { print("s=" + s); },
});

它不仅不起作用,Rhino本身也退出了,并且给了我相当的堆栈跟踪:

Exception in thread "main" java.lang.IllegalAccessError: class adapter1 cannot access its superclass mypackage.MyClass$MyInnerClass
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:676)
at org.mozilla.javascript.DefiningClassLoader.defineClass(DefiningClassLoader.java:62)
    ...

我做错了吗?有什么想法吗?

编辑:哦,我刚刚意识到MyClass没有被宣布为“公开”。可能是吗?

2 个答案:

答案 0 :(得分:1)

内部阶级必须是公开的。

package org.example;

public class Foo
{
    public abstract static class MyInnerClass
    {
        abstract void print(String s);
    }

    public void pr()
    {
        System.out.println("foo");
    }
}

第一次测试:子类并实例化外部Foo类:

$ java -classpath $PWD:/usr/share/java/js.jar:/usr/share/java/jline.jar:. org.mozilla.javascript.tools.shell.Main
Rhino 1.7 release 2 2010 01 20
js> var a = new JavaAdapter(Packages.org.example.Foo, {
  >   pr: function() { print("jsfoo"); },
  > });
js> a.pr();
jsfoo

第二次测试:子类并实例化内部类:

js> var b = new JavaAdapter(Packages.org.example.Foo.MyInnerClass, {
  >   print: function(s) { print("Inner: " + s); },
  > });
js> b.print("one");
Inner: one
undefined

注意:如果我更改内部类不公开,我会收到您报告的完全相同的错误。

答案 1 :(得分:0)

由于它的可见性是包私有,你可能只在同一个包中创建它的子类,也许这就是问题?