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

前端之家收集整理的这篇文章主要介绍了从javax.swing.text尝试针对AbstractDocument.UndoRedoDocumentEvent的instanceof时出现IllegalAccessError前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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)

为什么我不能对该类进行实例化,但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的MANIFEST(包含javax.swing.text包的那个)不包含“Sealed”.命令Package.getPackage(“javax.swing.text”).isSealed()返回false.

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

任何想法为什么会这样?

最佳答案
看起来UndoRedoDocument是受包保护的,而DefaultCaret.Handler和UndoRedoDocument在同一个包中(如果我没记错的话,javax.swing.text).

猜你在找的Java相关文章