使用反射来获取泛型信息
程序员文章站
2024-03-14 18:32:28
...
//涉及api
//获取类对应的Class对象
1 Class cls = Object.class;
//获取类的成员变量
2 Field flild = cls.getDeclaredField("");
//获取成员变量的数据类型(普通)
3 Class<?> type = field.getType();
////获取成员变量的数据类型(泛型)
4 Type gType = field.getGenericType();
还要强转为
if (gType instanceof ParameterizedType){
ParameterizedType pType = (ParameterizedType) gType;
//获取泛型的参数类型(String,Integer)
5 Type[] tArgs = pType.getActualTypeArguments();
//返回没有泛型信息的原始类型(Map)
6 Type rType = pType.getRawType()
public class Score {
//泛型类型参数类型
private Map<String,Integer> score;
//普通类型参数类型
private int grade;
}
//获取普通参数类型
/**
* Created by apple on 17/8/29.
*/
public class ScoreTest extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//1 获取Score的Class对象
Class cls = Score.class;
try {
//2 获取Score的成员变量
Field field_score = cls.getDeclaredField("score");
Field field_grade = cls.getDeclaredField("grade");
//3 获取普通类型参数
Class<?> type_score = field_score.getType();
Class<?> type_grade = field_grade.getType();
Log.d("shj--",type_score.getName());
Log.d("shj--",type_grade.getName());
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
//打印结果
D/shj--: java.util.Map
D/shj--: int
//如何获取泛型参数?
//如Map<String,Integer>,如何获取String,Integer?
public class ScoreTest extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//1 获取Score的Class对象
Class cls = Score.class;
try {
//2 获取Score的成员变量
Field field = cls.getDeclaredField("score");
//3 获取成员变量的泛型类型
Type type = field.getGenericType();
//4 强制转换为ParameterizedType
if (type instanceof ParameterizedType){
ParameterizedType pType = (ParameterizedType) type;
//5 获取泛型类型参数
Type[] tArgs = pType.getActualTypeArguments();
for (Type t:tArgs){
Log.d("shj--",t.toString());
}
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
//打印结果
D/shj--: interface java.util.Map
D/shj--: class java.lang.String
D/shj--: class java.lang.Integer
上一篇: 泛型的一些问题
下一篇: B. Box Fitting