问题的产生是由于泛型方法中如果实体本身就是基础数据类型的类该如何对实体进行处理,首先上一段代码吧:
/**
* @param <T>:声明方法是一个泛型方法,T声明泛型类型
* @param T 声明返回类型
* @param classz:泛型类型的具体类型,体现“参数化”
* @param classz
* @return
*/
public static <T> T doParams(Class<T> clazz) throws InstantiationException, IllegalAccessException {
T model = null;
// 获取实体类的所有属性,返回Field数组
model = clazz.newInstance();
Field[] field = model.getClass().getDeclaredFields();
for(Field fields: field){
String name = fields.getName();
fields.setAccessible(true); // 私有属性必须设置访问权限
fields.set(model, "");//可以按照业务需求自定义
Object resultValue = fields.get(model);
// 这里可以编写你的业务代码
System.out.println(name + ": " + resultValue);
}
return model;
}
方法中有个问题如果传入的是String类型,那么model.getClass().getDeclaredFields();就无法安装我们的预期运行,因为我们预期就是操作String实体本身,而不是String实体的属性。看一下调用结果
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
String ssss = doParams(String.class);
}
结果:
value: [C@7852e922
hash: 0
serialVersionUID: -6849794470754667710
serialPersistentFields: [Ljava.io.ObjectStreamField;@70dea4e
CASE_INSENSITIVE_ORDER: java.lang.String$CaseInsensitiveComparator@5c647e05
同样的问题发生在Map,Set等集合类型。从这个地方可以看出,泛型方法需要处理的有两种类型的情况,一种是自定义类型,自定义类型将Java Jdk中定义的基础类型作为属性封装。第二种情况是jdk中定义的基础类型,包括基本数据类型,集合等。代码做一下修改如下:
/**
* @param <T>:声明方法是一个泛型方法,T声明泛型类型
* @param T 声明返回类型
* @param classz:泛型类型的具体类型,体现“参数化”
* @param classz
* @return
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static <T> T doParams(Class<T> clazz) throws IllegalArgumentException, IllegalAccessException, InstantiationException {
T model = clazz.newInstance();
if (model instanceof Map){
((Map) model).put("properties", "sdsddxcxcsdsd");
}else if (model instanceof String) {
model = clazz.cast("sdsddxcxcsdsd");
}else {
// 获取实体类的所有属性,返回Field数组
Field[] field = model.getClass().getDeclaredFields();
for(Field fields: field){
String name = fields.getName();
fields.setAccessible(true); // 私有属性必须设置访问权限
fields.set(model, "");//可以按照业务需求自定义
Object resultValue = fields.get(model);
// 这里可以编写你的业务代码
System.out.println(name + ": " + resultValue);
}
}
return model;
}
输出结果:
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InstantiationException {
HashMap ss = doParams(HashMap.class);
System.out.println("HashMap.class,ss.get(\"properties\")="+ss.get("properties"));
String ssss = doParams(String.class);
System.out.println("String.class="+ssss);
}
输出结果:
HashMap.class,ss.get("properties")=sdsddxcxcsdsd
String.class=sdsddxcxcsdsd