反射克隆对象,将Map转化成JavaBean
程序员文章站
2022-03-31 16:53:17
...
反射初应用
利用反射克隆一个对象
public static <T> T clone(Object obj,Class<T> t){
T newObj = null;
try {
//基于传递的Class对象实例化一个空对象(数据为空)
newObj = t.newInstance();
//获取Class中的所有属性
Field[] fields = t.getDeclaredFields();
for (Field f : fields) {
//获取属性名
String fname = f.getName();
//获取属性类型
Class<?> ftype = f.getType();
//获取属性对应的setter/getter方法名称
String setMethodName = "set"+fname.substring(0,1).toUpperCase()+fname.substring(1);
String getMethodName = "get"+fname.substring(0,1).toUpperCase()+fname.substring(1);
//对于布尔类型的get方法,前缀以is开头
if(Objects.equals("boolean",ftype.getName())){
getMethodName = "is"+fname.substring(0,1).toUpperCase()+fname.substring(1);
}
//根据提供的方法名称和类型获取方法对象
Method methodSet = t.getMethod(setMethodName,ftype);
Method methodGet = t.getMethod(getMethodName);
//执行参数对象的get方法取出属性值,作为目标对象的set方法参数值
Object returnVal = methodGet.invoke(obj);
methodSet.invoke(newObj,returnVal);
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return newObj;
}
public static <T> T clone1(T obj) throws Exception {
Class<T> clazz = (Class<T>) obj.getClass();
T o = null;
o = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String name = field.getName();
Class<?> type = field.getType();
String suffix = name.substring(0,1).toUpperCase()+name.substring(1);
String getName = "get"+suffix;
String setName = "set"+suffix;
Method methodGet = clazz.getMethod(getName);
Method methodSet = clazz.getMethod(setName, type);
methodSet.invoke(o,methodGet.invoke(obj));
}
return o;
}
利用反射将map转化成javabean
public static <T> T mapToBean1(Map<String,? super Object> map,Class<T> t)throws Exception{
T instance = t.newInstance();
for (Map.Entry<String, ? super Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
Field field = t.getDeclaredField(key);
field.setAccessible(true);
field.set(instance,value);
}
return instance;
}
public static <T> T mapToBean(Map<String,Object> map, Class<T> t){
T target = null;
try {
//1. 实例化一个空对象
target = t.newInstance();
//2.获取Class中的所有属性名称
Field[] fields = t.getDeclaredFields();
for (Field f : fields) {
//获取属性名称(map集合的键)
String fieldName = f.getName();
//设置属性的可访问性为true(暴力反射)
f.setAccessible(true);
//设置属性的值 sname=XXX
f.set(target,map.get(fieldName));
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//返回目标对象
return target;
}