【问题标题】:How to subclass an inner (static) class in Rhino?如何在 Rhino 中继承内部(静态)类?
【发布时间】:2011-01-01 11:20:25
【问题描述】:

我正在尝试在 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 没有被声明为“公共”。会这样吗?

【问题讨论】:

  • 好吧,把它公开并回复我们:-)
  • 可能是的,取决于您尝试子类化的位置,您需要将其公开。

标签: java javascript subclass rhino inner-classes


【解决方案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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-18
      • 2012-03-06
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      相关资源
      最近更新 更多