java - 从 javax.swing.text 对 AbstractDocument.UndoRedoDocumentEvent 尝试 instanceof 时出现 IllegalAccessError

标签 java instanceof inner-classes

javax.swing.text.DefaultCaret.Handler.insertUpdate(DocumentEvent) 的源代码中,我发现了以下几行(从第 1685 行开始):

if (e instanceof AbstractDocument.UndoRedoDocumentEvent) {
    setDot(offset + length);
    return;
}

但是当我尝试这样做时:

package javax.swing.text;

public class Foo {
    public static void main(String[] args) {
        Object o = new Object();
        if (o instanceof AbstractDocument.UndoRedoDocumentEvent) {
            System.out.println("yay");
        } else {
            System.out.println("aww");
        }
    }
}

它将给出:

Exception in thread "main" java.lang.IllegalAccessError: tried to access class javax.swing.text.AbstractDocument$UndoRedoDocumentEvent from class javax.swing.text.Foo
    at javax.swing.text.Foo.main(Foo.java:6)

为什么我不能 instanceof 针对那个类,但是 DefaultCaret.Handler 可以?

使用 java 版本 1.6.0_20

$ java -version
java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.7) (6b20-1.9.7-0ubuntu1~10.04.1)
OpenJDK Client VM (build 19.0-b09, mixed mode, sharing)

更新:

根据我尝试的答案:

文件 Foo.java:

package javax.swing.text;

public class Foo {
    public static void main(String[] args) {
        Object o = new Object();
        if (o instanceof Outer.Inner) {
            System.out.println("yay");
        } else {
            System.out.println("aww");
        }
    }
}

文件Outer.java:

package javax.swing.text;

public class Outer {
    class Inner {
    }
}

这工作正常并按预期打印“aww”。

请注意,这两个文件都在包 javax.swing.text 中。另请注意,在我最初的问题中,Foo.java 已经在包 javax.swing.text 中。

据我所知,包裹没有“密封”。 rt.jar 的 list (包含包 javax.swing.text 的 list )不包含“Sealed”。命令 Package.getPackage("javax.swing.text").isSealed() 返回 false。

所以我可以针对我自己的内部类instance of,但不能针对 AbstractDocument.UndoRedoDocumentEvent,即使包中的其他类也可以。

知道这是为什么吗?

最佳答案

看起来 UndoRedoDocument 是受包保护的,DefaultCaret.HandlerUndoRedoDocument 在同一个包中(javax.Handler)。 swing.text 如果我没记错的话)。

关于java - 从 javax.swing.text 对 AbstractDocument.UndoRedoDocumentEvent 尝试 instanceof 时出现 IllegalAccessError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5606757/

相关文章:

java - 无法在 Java 8 中将 int 转换为 long

javascript - (obj instanceof ObjectClass) 不起作用?

java - 从堆栈跟踪中按名称获取类

java - 在Java中修改上层的变量

java - 如何在 Java 内部类中定义绑定(bind)类型参数

java - 用 Java 构建了部分上传系统,但视频损坏

java - 在WebLogic中获取JTA事务超时值

java - 如何避免从 URL.getFile() 获取 URL 编码路径?

java - 在内部类中访问局部变量(java)

java - java中Instanceof的正确用法