パンくず
書籍 パーフェクトJava
リフレクション
型情報の取得
概要
Javaのリフレクションの型情報の取得について。
サンプルコード
package perfect.reflection; import java.util.List; public class SampleReflection2 { enum NUM {ONE,TWO,THREE}; @SuppressWarnings("unused") public static void main(String[] args) throws ClassNotFoundException { // ClassクラスのstaticメソッドのclassForNameによる取得 Class<SampleReflectionInner> hogeClass = getClass("perfect.reflection.SampleReflection2$SampleReflectionInner"); // インターフェースか判断 System.out.print("String.class.isInterface():"); System.out.println(String.class.isInterface()); System.out.print("List.class.isInterface():"); System.out.println(List.class.isInterface()); // 配列か判断 System.out.print("String.class.isArray():"); System.out.println(String.class.isArray()); System.out.print("String[].class.isArray():"); System.out.println(String[].class.isArray()); // 基本型か判断 System.out.print("String.class.isPrimitive():"); System.out.println(String.class.isPrimitive()); System.out.print("int.class.isPrimitive():"); System.out.println(int.class.isPrimitive()); // Enumか判断 System.out.print("String.class.isEnum():"); System.out.println(String.class.isEnum()); System.out.print("NUM.class.isEnum():"); System.out.println(NUM.class.isEnum()); // publicメソッド名(基底クラス含む)を取得 System.out.print(String.class.getMethods()[0]); System.out.println(String.class.getMethods()[0]); // 全メソッド名(基底クラス含まない)を取得 System.out.print(String.class.getDeclaredMethods()[0]); System.out.println(String.class.getDeclaredMethods()[0]); // publicフィールド名(基底クラス含む)を取得 System.out.print(String.class.getFields()[0]); System.out.println(String.class.getFields()[0]); // 全フィールド名(基底クラス含まない)を取得 System.out.print(String.class.getDeclaredFields()[0]); System.out.println(String.class.getDeclaredFields()[0]); // 全てのpublicコンストラクタ情報を取得 System.out.print(String.class.getConstructors()[0]); System.out.println(String.class.getConstructors()[0]); // 基底クラスの取得 System.out.print("String.class.getSuperclass():"); System.out.println(String.class.getSuperclass()); // Enumの値取得 System.out.print("NUM.class.getEnumConstants()[0]:"); System.out.println(NUM.class.getEnumConstants()[0]); // 『Java 言語仕様』の定義に従って、基本となるクラスの正規名を返します。 System.out.print("String.class.getCanonicalName():"); System.out.println(String.class.getCanonicalName()); // ソースコード内で指定されたとおり、基本となるクラスの単純名を返します。 System.out.print("String.class.getSimpleName():"); System.out.println(String.class.getSimpleName()); } @SuppressWarnings("unchecked") public static <T> Class<T> getClass(String className) throws ClassNotFoundException { // Class型の変数名は伝統的にclazzを利用する。 Class<T> clazz = (Class<T>) Class.forName(className); return clazz; } public static class SampleReflectionInner { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void hoge(String hoge) { System.out.println("hoge:" + hoge); } } }
出力
String.class.isInterface():false List.class.isInterface():true String.class.isArray():false String[].class.isArray():true String.class.isPrimitive():false int.class.isPrimitive():true String.class.isEnum():false NUM.class.isEnum():true public boolean java.lang.String.equals(java.lang.Object)public boolean java.lang.String.equals(java.lang.Object) public boolean java.lang.String.equals(java.lang.Object)public boolean java.lang.String.equals(java.lang.Object) public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDERpublic static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER private final char[] java.lang.String.valueprivate final char[] java.lang.String.value public java.lang.String()public java.lang.String() String.class.getSuperclass():class java.lang.Object NUM.class.getEnumConstants()[0]:ONE String.class.getCanonicalName():java.lang.String String.class.getSimpleName():String