現在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 件のコメント:
コメントを投稿