java - 如何在 Rhino 中子类化内部(静态)类?

标签 java javascript subclass rhino inner-classes

我正在尝试在 Rhino 中子类化一个内部类(在 Java 中定义),但我似乎无法使其工作。

我有一些已编译的 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 没有声明为“公共(public)”。会是这样吗?

最佳答案

内部类必须是公共(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

注意:如果我将内部类更改为不公开,我会收到与您报告的完全相同的错误。

关于java - 如何在 Rhino 中子类化内部(静态)类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4572803/

相关文章:

java - 尝试使用 Spring Boot 从 POST 请求正文读取嵌套 JSON 时获取 null

java - 在具有滚动功能的 JTextArea 中显示数组

javascript - Angular 2 - 使用 Angular-route 3.3.0 覆盖路线

javascript - 使用复选框重置下拉菜单

swift - 在 Swift 中进行子类化时理解 init()

java - 从servlet获取json响应并显示在jsp表中?

java - 曼宁·斯普林 (Manning Spring),Hibernate 封面图片

用于计算产品价格的 JavaScript 构建和算法

c++ - Borland C++ Builder 中的 Windows 子类化

java - 如何在运行时检查子类是否是类的实例?