のソースで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
これはなぜですか?