リフレクション

ジェネリックな数値キャスト(プリミティブ拡大変換、縮小変換)

概要 今日は、ジェネリックな数値キャストをします。 やりたいこと プリミティブ型の数値キャスト(プリミティブ拡大変換、縮小変換)と呼ばれる演算があります。 たとえば、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で落ちる…

ParameterizedType実装クラスのtoStringおかしくない?

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キーワードで宣言されるEnum継承クラス(ここではE)のコンストラクタは、リフレクションで調べると… package test; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class EnumConstructorTest { pri…