简体   繁体   English

如何在Rhino中对内部(静态)类进行子类化?

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

I'm trying to subclass an inner class (defined in Java) in Rhino, and I can't seem to make it work. 我正在尝试在Rhino中对内部类(用Java定义)进行子类化,但似乎无法使其正常工作。

I've got some compiled Java code (which I essentially can't change) that has an inner abstract class: 我有一些带有内部抽象类的已编译Java代码(我基本上不能更改):

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

From Rhino, I can see it just fine: 从Rhino,我可以很好地看到它:

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

But I can't figure out how to subclass it. 但是我不知道如何对其进行子类化。 I figured something like this would work, since I do it for non-inner classes: 我想像这样的事情会起作用,因为我是针对非内部类的:

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

Not only does it not work, Rhino itself quits, and gives me quite the stack trace: 它不仅不起作用,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)
    ...

Am I doing it wrong? 我做错了吗? Any ideas? 有任何想法吗?

EDIT: Oh, I just realized that MyClass isn't declared "public". 编辑:哦,我才意识到MyClass没有声明为“公共”。 Could that be it? 可以吗?

The inner class must be public. 内部类必须是公共的。

package org.example;

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

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

First test : Subclass and instantiate the outer Foo class: 第一个测试 :子类化并实例化外部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

Second test : Subclass and instantiate the inner class: 第二个测试 :子类化并实例化内部类:

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

Note : If I change the inner class not to be public, I get the exact same error you reported. 注意 :如果我将内部类更改为不公开,则会收到与您报告的错误完全相同的错误。

因为它的可见性是包私有的,所以您只能在同一包中创建它的子类,也许是问题所在吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM