反射和泛型

  在反射中使用泛型,可以避免生成對象時的強制類型轉換,也就不會拋出ClassCastException。

  若通過Class.forName(String name)去得到Class對象,然後再通過newInstance()方法創建對象的實例的話,返回值是一個Object類型的,若你知道它是Date類型的,你就可以強制轉換,但是你卻用ArrayList類型去強制轉換的話,你就會拋出ClassCastException,導致程序的終止,如果你用泛型的話,你就可以避免這個困擾了,下面我們演示一個生成實例的方法:

public class InstanceFactory {
	
	public static <T>T getInstance(Class<T> clazz) {
		
		try {
			return clazz.newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
			return null;
		} catch (IllegalAccessException e) {
			e.printStackTrace();
			return null;
		}
	}
}

通過這樣的方式去生成實例的話,就不用進行強制轉換了。

  下面介紹一下如何去通過反射獲取泛型的信息,看個例子:

public class TestField {
	
	private Map<Integer, String> map;
	
	public static void main(String[] args) {
		
		Class<TestField> clazz = TestField.class;
		
		try {
			
			Field field = clazz.getDeclaredField("map");
			Class<?> type = field.getType();
			System.out.println(type);
			
			Type gType = field.getGenericType();
			System.out.println(gType);
			
			ParameterizedType pType = (ParameterizedType)gType;
			Type rType = pType.getRawType();
			System.out.println(rType);
			
			Type[] aType = pType.getActualTypeArguments();
			for(Type t : aType) {
				
				System.out.println(t);
			}
			
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		}
	}
}

Field的getType()方法只能得到沒有泛型的Map信息,而getGenericType()方法可以得到泛型的參數類型信息,通過強制轉換成ParameterizedType類型,我們可以通過getRawType()方法得到原始類型,通過getActualTypeArguments()方法得到各個參數的實際類型了,非常方便,結果顯示如下:

interface java.util.Map
java.util.Map<java.lang.Integer, java.lang.String>
interface java.util.Map
class java.lang.Integer
class java.lang.String



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章