2011-01-01 9 views
1

Rhino에서 내부 클래스 (Java로 정의 됨)를 서브 클래스로 만들려고하고 있는데 제대로 작동하지 않는 것 같습니다.Rhino에서 내부 (정적) 클래스를 서브 클래 싱하는 방법은 무엇입니까?

좀 컴파일 된 자바 코드 (나는 기본적으로 변경할 수없는) 내부 추상 클래스가 그있어

는 : 코뿔소에서

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

을, 내가 잘 볼 수 있습니다 :

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가 "공개"로 선언되지 않았 음을 알았습니다. 그게 될 수 있을까요?

+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"); 
    } 
} 

첫번째 테스트 :

$ 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 

번째 테스트 : 서브 클래스 및 외측 Foo 클래스의 인스턴스 서브 클래스 및 내부 클래스의 인스턴스 :

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

참고을 : 내부 클래스 n을 변경하면 공개하겠습니다. 귀하가 신고 한 것과 똑같은 오류가 발생합니다.

관련 문제