В источнике 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
(тот, который содержал упаковку javax.swing.text
) не содержал «Запечатано».Команда Package.getPackage("javax.swing.text").isSealed()
возвращает false.
Так что я могу instance of
против своего собственного внутреннего класса, но не против AbstractDocument.UndoRedoDocumentEvent
, хотя другие классы из пакета могут.
Любые идеипочему это?