在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).