在 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.Handler
和 UndoRedoDocument
在同一个包中(javax.Handler)。 swing.text
如果我没记错的话)。
关于java - 从 javax.swing.text 对 AbstractDocument.UndoRedoDocumentEvent 尝试 instanceof 时出现 IllegalAccessError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5606757/