リフレクション
概要 今日は、ジェネリックな数値キャストをします。 やりたいこと プリミティブ型の数値キャスト(プリミティブ拡大変換、縮小変換)と呼ばれる演算があります。 たとえば、double型をshort型に変換する場合 short s = (short)3.0;これをジェネリックにするに…
概要 今日は、ラッパー型のClassオブジェクトとプリミティブ型のClassオブジェクトを相互に変換してみます。 ラッパー→プリミティブ staticフィールドであるInteger.TYPE はint.classを返します。 他のラッパークラスにも同名のフィールドがあるので、リフレ…
概要 Classオブジェクト(特にプリミティブ型)から、変数のデフォルト値を取得する。 前提 static変数、インスタンス変数、配列の要素はデフォルト値で初期化されます。 Each class variable, instance variable, or array component is initialized with a d…
ローカルクラスは定義されたメソッド*1のローカル変数を参照することができる。 バイトコード上どうなってるの?と知りたかったのでリフレクションで簡単に調査。 まとめ ローカルクラス*2のコンストラクタ引数の型は、リフレクションで見ると (non-static c…
型パラメータつきのクラスに定義された内部クラスを、 型パラメータがワイルドカードの変数で参照されるインスタンスをエンクロージングインスタンスとして、 無名クラスで拡張すると、 Class.getGenericSuperClass() がGenericSignatureFormatErrorで落ちる…
staticネストクラスを含むParameterizedType(インターフェースなので実装があるはず)を取得すると、toString()がよくわからない文字列になる。 読み方がわかる方、教えてください。 package test; import java.lang.reflect.ParameterizedType; public class…
要素型から配列型を取得したい。 Array.newInstanceで配列を生成してgetClassで取得できる。 package test; import java.lang.reflect.Array; public class GetArrayTypeTest { @SuppressWarnings("unchecked") public static <T> Class<T[]> getArrayType(final Cla</t[]></t>…
enumキーワードで宣言されるEnum継承クラス(ここではE)のコンストラクタは、リフレクションで調べると… package test; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class EnumConstructorTest { pri…