2011-01-01 19 views
1

私はRhinoで内部クラス(Javaで定義されている)をサブクラス化しようとしています。私は内側の抽象クラスを持っているいくつかのコンパイルされたJavaコード(私は基本的に変更することはできませんどの)持ってRhinoで内部(静的)クラスをサブクラス化する方法は?

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); }, 
}); 

だけでなく、それは動作しません、サイ自体が終了し、私にかなりのスタックトレースを与える:私は非内部クラスのためにそれを行うことから、このような何かが働くと考えました

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

私は間違っているのですか?何か案は?

EDIT:まあ、私は、MyClassが "public"と宣言されていないことに気付きました。それはそれかもしれませんか?

+0

よく、公開して私たちに連絡してください:-) – Pointy

+0

おそらくはい、サブクラス化しようとしている場所によっては公開する必要があります。 – fmucar

答えて

0

可視性はパッケージプライベートなので、同じパッケージでそのサブクラスを作成することはできますか?それはおそらく問題でしょうか?

1

内部クラスはpublicである必要があります。

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 

ました:内部クラスnを変更するとあなたが報告したのと全く同じエラーが出ます。

関連する問題