Javaで一般に内部クラスと呼ばれるものはバリエーションが4つあるのですが、リフレクションでこれらを用いる場合に
結構ハマるポイントがあります。
| 判別法 | 外部クラスのインスタンス | コンストラクタ |
staticなネストしたクラス | Class#isMemberClass()がtrue かつ、Class#getModifiers()がModifier#isStatic()でtrue |
アクセス不可 |
|
エンクロージング型内部クラス | Class#isMemberClass()がtrue かつ、Class#getModifiers()がModifier#isStatic()でfalse |
外部クラス名.this でアクセス可能 |
第一引数に暗黙に外部クラスのインスタンスを受け取る |
メソッド内で定義されるローカルクラス | Class#isLocalClass() |
宣言されたメソッドがstaticなら不可。インスタンスメソッドならば、外部クラス名.this でアクセス可能 |
インスタンスメソッドで宣言された場合、第一引数に暗黙に外部クラスのインスタンスを受け取る |
匿名クラス | Class#isAnonymousClass() |
外部クラス名.this でアクセス可能 |
第一引数に暗黙に外部クラスのインスタンスを受け取る |
とあって、staticなネストしたクラスとエンクロージング型内部クラスの判別が面倒臭い。
また、staticなネストしたクラス以外は、暗黙にコンストラクタの第一引数に外部クラスのインスタンスを受け取るので
リフレクションでConstructorを扱う時にはシグネチャに注意。
とくに、メソッドで定義するローカルクラスは、宣言がstaticメソッドか、インスタンスメソッドかで
違ってくるためClass#getModifiers()の値を確認して丁寧に対応する必要があります。