Как создать подкласс внутреннего (статического) класса в Rhino? - PullRequest
1 голос
/ 01 января 2011

Я пытаюсь создать подкласс внутреннего класса (определенного в Java) в Rhino, и я не могу заставить его работать.

У меня есть некоторый скомпилированный код 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 не объявлен "публичным".Может ли это быть?

Ответы [ 2 ]

1 голос
/ 01 января 2011

Внутренний класс должен быть публичным.

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

Примечание : Если я изменю внутренний класс, чтобы он не был общедоступным, я получу точно такую ​​же ошибку, о которой вы сообщили.

0 голосов
/ 01 января 2011

Поскольку его видимость является частным пакетом, вы можете создать его только в одном пакете, может быть, в этом проблема?

...