项目中,最近有这种需求,然后自己根据API提供的类,写了两个Object转Map的方法:
/**
* 使用java.beans.Introspector转换
* @param object
* @return map
* @throws Exception
*/
public static Map<String, Object> obj2Map(Object object){
Map<String, Object> map = new HashMap<String, Object>();
// 获取Object对象
BeanInfo beanInfo = null;
try {
beanInfo = Introspector.getBeanInfo(object.getClass());
} catch (IntrospectionException e) {
e.printStackTrace();
}
// 获取Object属性描述
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor property : propertyDescriptors) {
String key = property.getName(); //获取属性名
if (key.compareToIgnoreCase("class") == 0) {
continue;
}
Method getter = property.getReadMethod();
Object value = null;
try {
value = getter != null ? getter.invoke(object) : null;//获取值
map.put(key, value);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
}
return map;
}
/**
*
* 使用java.lang.reflect进行转换
* @param object
* @return map
*/
public static Map<String, Object> objToMap(Object object){
Map<String, Object> map = new HashMap<String, Object>();
try{
Field[] declaredFields = object.getClass().getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
try {
map.put(field.getName(), field.get(object));
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
}catch(SecurityException e){
e.printStackTrace();
}
return map;
}
新建一个对象测试下:
public class Test {
private String sex;
private String name;
public Test(){
}
public Test(String sex,String name){
this.sex = sex;
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Test [sex=" + sex + ", name=" + name + "]";
}
}
结果截图: