Javaで、プリミティブ型の名前でClassオブジェクト返すメソッドを用意した。
Javaおいてリフレクションを利用する際、クラス名を指定してClassオブジェクトを得るメソッド
クラス:java.lang.Class
メソッド:static Class forName(String className)
指定された文字列名を持つクラスまたはインタフェースに関連付けられた、Class オブジェクトを返します。
があります。
この関数は、引数名に"int"や"boolean"を指定しても、Classオブジェクトを得ることができません。指定した場合、"ClassNotFoundException"が発生します。
Class<?> clazz = Class.forName("int"); // throw ClassNotFoundException
そもそも"int"などのプリミティブ型は、クラス型と異なるので、引数classNameに指定できないのはもっともなのかもしれません。
※"int"のクラス型である"integer"は、forName()で取得できます。
Class<?> clazz = Class.forName("java.lang.Integer");
プリミティブ型のClassオブジェクトを得るためには、その型に対応するClassオブジェクトを直接する指定して得ることになります。
Class<?> clazz1 = int.class; Class<?> clazz2 = boolean.class;
しかし、このようにプリミティブ型とクラス型でClassオブジェクトを得るために処理を変えるのはめんどいので、forName()のラッパーメソッドを作ると楽です。
※Beanクラスで値を参照・セットするユーティリティクラスを作成する際、Beanクラスの変数の型でメソッドを呼び変えるのはめんどいです(´Д` )
ReflectionUtils.java
package jp.namihira.util; import java.util.HashMap; import java.util.Map; /** * リフレクションをサポートするメソッドをまとめたクラス * Copyright 2013 Kosuke NAMIHIRA All Rights Reserved. * * @author Kohsuke NAMIHIRA */ public class ReflectionUtils { private static final Map<String, Class<?>> PRIMITIVE_TYPE_MAP = new HashMap<String, Class<?>>(); static { registerPrimitiveType("byte", byte.class); registerPrimitiveType("short", short.class); registerPrimitiveType("int", int.class); registerPrimitiveType("long", long.class); registerPrimitiveType("boolean", boolean.class); registerPrimitiveType("float", float.class); registerPrimitiveType("double", double.class); registerPrimitiveType("char", char.class); } private ReflectionUtils() { } private static void registerPrimitiveType(String typeName, Class<?> clazz) { PRIMITIVE_TYPE_MAP.put(typeName, clazz); } /** * クラス名から、型を取得します。Primitiveな型に対しても、そのClassオブジェクトを返却します。<br/> * 例:"int" -> int.class * @param className * 型の取得対象となるクラス名 * @return オブジェクトの型 */ @SuppressWarnings("unchecked") public static <T> Class<T> getType(String className) throws ClassNotFoundException{ if (PRIMITIVE_TYPE_MAP.containsKey(className)) { return (Class<T>) PRIMITIVE_TYPE_MAP.get(className); } return (Class<T>) Class.forName(className); } }