通過指定對應的Class對象,程序可以獲得該類里面所有的Field,不管該Field使用private 方法public。獲得Field對象后都可以使用getType()來獲取其類型。
Class<?> type = f.getType();//獲得字段的類型
但此方法只對普通Field有效,若該Field有泛型修飾,則不能准確得到該Field的泛型參數,如Map<String,Integer>;
為了獲得指定Field的泛型類型,我們采用:
Type gType = f.getGenericType();得到泛型類型
然后將Type對象強轉為ParameterizedType,其表示增加泛型后的類型
Type getRawType()//返回被泛型限制的類型;
Type[] getActualTypeArguments()//返回泛型參數類型;
利用反射來獲取泛型的類型(泛型信息)
步驟:
1.獲取當前類
2.獲取目標字段
3.獲取包含泛型類型的類型 getGenericType()
4.強轉至子類ParameterizedType因為Type沒有任何對應的方法
5.獲得泛型真正的類型 getActualTypeArguments()
例子
package junereflect624;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
public class GetGenericTypeDemo14 {
Map<String,Integer> map = new HashMap<String,Integer>();
public static void main(String[] args) throws Exception {
Class c = GetGenericTypeDemo14.class;
Field f = c.getDeclaredField("map");
System.out.println(f);
System.out.println(f.getName());//map
// Class<?> getType() 返回一個 Class 對象,它標識了此 Field 對象所表示字段的聲明類型。
Class cl = f.getType();
System.out.println("獲得其類型:"+cl);
//獲得其類型:interface java.util.Map
/**
* Type getGenericType() 返回一個 Type 對象,它表示此 Field 對象所表示字段的聲明類型。
* Type是Class的接口;
*/
Type t = f.getGenericType();//包含泛型的類型
System.out.println(t);
//java.util.Map<java.lang.String, java.lang.Integer>
/**
* Type這個類里面沒有任何的方法,所以需要調用子類的方法,那么大的類型轉到小的類型,需要強轉!
*/
ParameterizedType pt = (ParameterizedType)t;//強轉到其子類
/**
* Type[] getActualTypeArguments()
返回表示此類型實際類型參數的 Type對象的數組。
Type getOwnerType()
返回 Type 對象,表示此類型是其成員之一的類型。
Type getRawType()
返回 Type 對象,表示聲明此類型的類或接口。
*/
t = pt.getRawType();//類型的類或接口
System.out.println(t);
Type[] ts = pt.getActualTypeArguments();
for (Type type : ts) {
System.out.println(type);
/**
* class java.lang.String
class java.lang.Integer
*/
}
}
}
打印:
java.util.Map junereflect624.GetGenericTypeDemo14.map
map
獲得其類型:interface java.util.Map
java.util.Map<java.lang.String, java.lang.Integer>
interface java.util.Map
class java.lang.String
class java.lang.Integer
我的總結:多查找api,參考api中方法使用的限制,比如是否靜態、返回值類型等。