如何在Rhino中对内部(静态)类进行子类化? [英] How to subclass an inner (static) class in Rhino?
问题描述
我正在尝试在Rhino中对内部类(用Java定义)进行子类化,但似乎无法使其正常工作.
I'm trying to subclass an inner class (defined in Java) in Rhino, and I can't seem to make it work.
我有一些带有内部抽象类的已编译Java代码(我基本上不能更改):
I've got some compiled Java code (which I essentially can't change) that has an inner abstract class:
package mypackage;
class MyClass {
abstract static class MyInnerClass {
abstract void print(String s);
}
}
从Rhino,我可以很好地看到它:
From Rhino, I can see it just fine:
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); },
});
它不仅不起作用,Rhino本身也退出了,并给了我很多堆栈跟踪信息:
Not only does it not work, Rhino itself quits, and gives me quite the 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)
...
我做错了吗?有什么想法吗?
Am I doing it wrong? Any ideas?
哦,我才意识到MyClass没有被声明为"public".可以吗?
Oh, I just realized that MyClass isn't declared "public". Could that be it?
推荐答案
内部类必须是公共的.
package org.example;
public class Foo
{
public abstract static class MyInnerClass
{
abstract void print(String s);
}
public void pr()
{
System.out.println("foo");
}
}
首次测试:子类化并实例化外部Foo
类:
First test: Subclass and instantiate the outer Foo
class:
$ 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.
这篇关于如何在Rhino中对内部(静态)类进行子类化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!