2011-01-01 12 views
1

Ich versuche, eine innere Klasse (definiert in Java) in Rhino Unterklasse, und ich kann nicht scheinen, damit es funktioniert.Wie unterklassiere ich eine innere (statische) Klasse in Rhino?

ich einige kompilierten Java-Code haben (was ich kann im Wesentlichen nicht ändern), die eine innere abstrakte Klasse hat:

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

Von Rhino, kann ich es sehen ganz gut:

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

Aber ich kann nicht herausfinden, wie man es unterklassifiziert. Ich dachte, so etwas wie dies funktionieren würde, da ich es für nicht-innere Klassen zu tun:

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

Nicht nur, dass es nicht funktioniert, Rhino selbst beendet wird, und gibt mir die ganz Stack-Trace:

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) 
    ... 

Mache ich es falsch? Irgendwelche Ideen?

EDIT: Oh, ich habe gerade festgestellt, dass MyClass nicht "öffentlich" erklärt wird. Könnte es das sein?

+0

Nun, machen Sie es öffentlich und kommen Sie zurück zu uns :-) – Pointy

+0

Wahrscheinlich ja, je nachdem, wo Sie versuchen, Unterklasse, müssen Sie es öffentlich machen. – fmucar

Antwort

0

Da es Sichtbarkeit ist Paket privat ist, können Sie nur Unterklasse desselben Pakets erstellen, vielleicht ist das das Problem?

1

Die innere Klasse muss öffentlich sein.

package org.example; 

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

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

Erster Test: Subclass und instanziiert die äußere Foo Klasse:

$ 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 

Zweiter Test: Subclass und instanziiert die innere Klasse:

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

Hinweis: Wenn ich die innere Klasse n ändere Um öffentlich zu sein, erhalte ich genau den gleichen Fehler, den Sie gemeldet haben.

Verwandte Themen