从javax.swing.text尝试针对AbstractDocument.UndoRedoDocumentEvent的instanceof时出现IllegalAccessError

les*_*ana 5 java instanceof inner-classes

javax.swing.text.DefaultCaret.Handler.insertUpdate(DocumentEvent)我的来源中找到以下行(从第1685行开始):

if (e instanceof AbstractDocument.UndoRedoDocumentEvent) {
    setDot(offset + length);
    return;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试这个:

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它会给:

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)
Run Code Online (Sandbox Code Playgroud)

为什么我不能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)
Run Code Online (Sandbox Code Playgroud)

更新:

根据答案我尝试了以下内容:

档案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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

档案Outer.java:

package javax.swing.text;

public class Outer {
    class Inner {
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好,并按预期打印"aww".

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

据我所知,包装没有"密封".MANIFEST rt.jar(包含包装的那个javax.swing.text)不包含"密封".该命令Package.getPackage("javax.swing.text").isSealed()返回false.

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

任何想法为什么会这样?

EMM*_*ICH 3

它看起来像是UndoRedoDocument受包保护的,并且DefaultCaret.HandlerUndoRedoDocument位于同一个包中(javax.swing.text如果我没记错的话)。