なみひらブログ

学んだことを日々記録する。~ since 2012/06/24 ~

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);
	}
}