在反射中使用泛型,可以避免生成對象時的強制類型轉換,也就不會拋出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