對AbstractDocument.UndoRedoDocumentEvent的instanceof試圖在javax.swing.text.DefaultCaret.Handler.insertUpdate(DocumentEvent)
來源時,我發現下面的線(始於1685線):IllegalAccessError從javax.swing.text中
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)
UPDATE:
基於答案我試過如下:
文件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 {
}
}
這工作得很好,並打印 「噢」 的預期。
請注意,這兩個文件都在包javax.swing.text
中。還請注意,Foo.java
已經在我原始問題中的包javax.swing.text
中。
據我可以告訴包是不是「密封」。清單rt.jar
(包含包javax.swing.text
的清單)不包含「密封」。命令Package.getPackage("javax.swing.text").isSealed()
返回false。
所以我可以instance of
針對我自己的內部類,但不是針對AbstractDocument.UndoRedoDocumentEvent
,即使包中的其他類也可以。
任何想法爲什麼這樣?
我嘗試使用我自己的類(和內部類),它的工作。該包似乎並沒有被封印。我用更多的信息更新了這個問題。 – lesmana 2011-04-09 19:29:45
有點晚了,但我認爲一個原因可能是你的類和swing類是由不同的類加載器加載的,並且從不同的類加載器加載的包不被認爲是相同的包,即使它們具有相同的名稱。 – 2011-06-12 15:37:19
ŭloEbermann:不算太晚。我仍然對答案感興趣。是否有可能檢查哪個類加載了哪個類加載器?如果你解釋瞭如何使用兩個不同的類加載器來使用自制類來重現錯誤消息,那麼獎勵點。這將證明你的假設。 – lesmana 2011-06-12 21:49:29