凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 47085
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

2008年9月8日

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()の値を確認して丁寧に対応する必要があります。

posted @ 21:24 | Feedback (973)