簡體   English   中英

如何在Rhino中對內部(靜態)類進行子類化?

[英]How to subclass an inner (static) class in Rhino?

我正在嘗試在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沒有聲明為“公共”。 可以嗎?

內部類必須是公共的。

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

注意 :如果我將內部類更改為不公開,則會收到與您報告的錯誤完全相同的錯誤。

因為它的可見性是包私有的,所以您只能在同一包中創建它的子類,也許是問題所在嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM