ページ

2015年2月15日日曜日

Javaのリフレクションまとめ1

現在Slim3をやってる中で出くわしたリフレクションの数々

ちなみに、reflectionのreflectは反映する、影響する等の意味

1. 継承ループ
Objectクラス以外の継承されたサブクラスから継承元までをループさせるやつ

for (Class<?> c = getClass(); c != Object.class; c = c.getSuperClass();) {
      ・・・ループ処理・・・
}
※getSuperClass()
   Objectクラス、インターフェース、プリミティブ型、voidの場合はnullを返却


2. パラメータ化された基底クラス
例)
  public abstract class SuperClass<T> {
  }

  public class SubClass extends SuperClass<String> {
  }
  上記のクラスでString型を取得したい場合

for (Class<?> c = getClass(); c != Object.class; c = c.getSuperClass();) {
      if (c.getSuperClass == SuperClass.class) {  ※SuperClassを直接継承しているクラスか?
          Type type = c.getGenericSuperClass();
          if (type instanceof ParameterizedType) { ※型パラメータを持つか?
             ※型引数の配列を取得しClassオブジェクトへキャスト
             Type[] arrayType = ((ParameterizedType)type).getActualTypeArguments();
              Class<?> class = Class.class.cast(arrayType[0]);
          }
      }
}

ややこしや〜><
↓参考サイト
http://sourceforge.jp/projects/figer/scm/svn/blobs/27/figer-s2-tiger/trunk/src/main/java/org/seasar/extension/jdbc/service/S2AbstractService.java

http://www.seasar.org/source/browse/s2container/trunk/s2-tiger/src/main/java/org/seasar/framework/util/tiger/GenericUtil.java?view=markup

http://tech.cm55.com/wiki/java/GenericsInfo


↓Class<T>クラスに関して解説しているサイト
http://waman.hatenablog.com/entry/20101007/1286440563

0 件のコメント:

コメントを投稿