com.datastax.util.lang.ReflectObjectUtil Maven / Gradle / Ivy
The newest version!
package com.datastax.util.lang;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import java.util.stream.Collectors;
/**
* Created by hsuyung on 2019/1/17.
*/
public class ReflectObjectUtil {
/**
* 单个对象的所有键值
* @param obj
* @return
*/
public static Map getKeyAndValue(Object obj) {
if(obj == null)
return null;
Map map = new HashMap<>();
// 得到类对象
Class objClass = obj.getClass();
// 得到类中的所有属性集合
Field[] fs = objClass.getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
Field f = fs[i];
f.setAccessible(true); // 设置些属性是可以访问的
try {
Object val = f.get(obj); // 得到此属性的值
map.put(f.getName(), val);// 设置键值
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return map;
}
/**
* 映射同属性名到其他对象
* @param obj
* @param target
* @param
* @return
*/
public static T copyToTarget(Object obj, T target) {
if(obj == null)
return null;
// 得到类对象
Class objClass = obj.getClass();
// 得到类中的所有属性集合
Field[] fs = objClass.getDeclaredFields();
Field[] superFs = objClass.getSuperclass().getDeclaredFields();
setFields(obj, target, fs, 0);
setFields(obj, target, superFs, 1);
return target;
}
/**]
* @param obj
* @param target
* @param fs
* @param level 0,1 0 当前层级,1 父类层级
* @param
*/
private static void setFields(Object obj, T target, Field[] fs, int level) {
Method[] methods = target.getClass().getMethods();
for (int i = 0; i < fs.length; i++) {
Field f = fs[i];
f.setAccessible(true); // 设置些属性是可以访问的
try {
Object val = f.get(obj);
for (Method method :methods){
try {
if(method.getName().startsWith("set") && method.getParameterCount() == 1 ){
Class paramClass = method.getParameterTypes()[0];
if(! paramClass.equals(f.getType())) continue;
if(paramClass.equals(Boolean.class)
|| paramClass.equals(boolean.class)){
if(method.getName().toLowerCase().equals("set"+f.getName().substring(2).toLowerCase())){
method.invoke(target,val);
}else if(method.getName().toLowerCase().equals("set"+f.getName().toLowerCase())){
method.invoke(target,val);
}
}else {
if(method.getName().toLowerCase().equals("set"+f.getName().toLowerCase())){
method.invoke(target,val);
}
}
}
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
/**
* 单个对象的某个键的值
* @param obj
* @param key
* @return
*/
public static Object getValueByKey(Object obj, String key) {
if(obj == null)
return null;
Class objClass = obj.getClass();
// 得到类中的所有属性集合
Field[] fs = objClass.getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
Field f = fs[i];
f.setAccessible(true); // 设置些属性是可以访问的
try {
if (f.getName().endsWith(key)) {
return f.get(obj);
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
// 没有查到时返回空字符串
return null;
}
public static List