java 动态获取对象属性值_通过Java反射机制,动态给对象属性赋值,并获取属性值...

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.HashMap;

import java.util.Locale;

import java.util.Map;

import java.util.Map.Entry;

/*

* 通过Java反射机制,动态给对象属性赋值,并获取属性值

*/

public class ClassRefUtil {

/**

* @param args

*/

public static void main(String[] args) {

Map valMap = new HashMap();

valMap.put("userName", "michael");

valMap.put("age", "27");

valMap.put("height", "173.5");

valMap.put("date", "2010-10-24");

valMap.put("times", "1287932898276");

valMap.put("flag", "false");

ChildInfo rl = new ChildInfo();

System.out.println("通过反射赋值.");

PublicUtil.setFieldValue(rl, valMap);

System.out.println("通过反射取值:");

int i = 0;

Map fieldValMap = PublicUtil.getFieldValueMap(rl);

for (Entry entry : fieldValMap.entrySet()) {

i++;

System.out.println("[字段 "+i+"] ["+entry.getKey()+"] --- [" + entry.getValue()+"]");

}

}

/**

* 取Bean的属性和值对应关系的MAP

* @param bean

* @return Map

*/

public static Map getFieldValueMap(Object bean) {

Class> cls = bean.getClass();

Map valueMap = new HashMap();

// 取出bean里的所有方法

Method[] methods = cls.getDeclaredMethods();

Field[] fields = cls.getDeclaredFields();

for (Field field : fields) {

try {

String fieldType = field.getType().getSimpleName();

String fieldGetName = parGetName(field.getName());

if (!checkGetMet(methods, fieldGetName)) {

continue;

}

Method fieldGetMet = cls.getMethod(fieldGetName, new Class[] {});

Object fieldVal = fieldGetMet.invoke(bean, new Object[] {});

String result = null;

if ("Date".equals(fieldType)) {

result = fmtDate((Date) fieldVal);

} else {

if (null != fieldVal) {

result = String.valueOf(fieldVal);

}

}

valueMap.put(field.getName(), result);

} catch (Exception e) {

continue;

}

}

return valueMap;

}

/**

* set属性的值到Bean

* @param bean

* @param valMap

*/

public static void setFieldValue(Object bean, Map valMap) {

Class> cls = bean.getClass();

// 取出bean里的所有方法

Method[] methods = cls.getDeclaredMethods();

Field[] fields = cls.getDeclaredFields();

for (Field field : fields) {

try {

String fieldSetName = parSetName(field.getName());

if (!checkSetMet(methods, fieldSetName)) {

continue;

}

Method fieldSetMet = cls.getMethod(fieldSetName, field.getType());

String value = valMap.get(field.getName());

if (null != value && !"".equals(value)) {

String fieldType = field.getType().getSimpleName();

if ("String".equals(fieldType)) {

fieldSetMet.invoke(bean, value);

} else if ("Date".equals(fieldType)) {

Date temp = parseDate(value);

fieldSetMet.invoke(bean, temp);

} else if ("Integer".equals(fieldType) || "int".equals(fieldType)) {

Integer intval = Integer.parseInt(value);

fieldSetMet.invoke(bean, intval);

} else if ("Long".equalsIgnoreCase(fieldType)) {

Long temp = Long.parseLong(value);

fieldSetMet.invoke(bean, temp);

} else if ("Double".equalsIgnoreCase(fieldType)) {

Double temp = Double.parseDouble(value);

fieldSetMet.invoke(bean, temp);

} else if ("Boolean".equalsIgnoreCase(fieldType)) {

Boolean temp = Boolean.parseBoolean(value);

fieldSetMet.invoke(bean, temp);

} else {

System.out.println("not supper type" + fieldType);

}

}

} catch (Exception e) {

continue;

}

}

}

/**

* 格式化string为Date

* @param datestr

* @return date

*/

private static Date parseDate(String datestr) {

if (null == datestr || "".equals(datestr)) {

return null;

}

try {

String fmtstr = null;

if (datestr.indexOf(':') > 0) {

fmtstr = "yyyy-MM-dd HH:mm:ss";

} else {

fmtstr = "yyyy-MM-dd";

}

SimpleDateFormat sdf = new SimpleDateFormat(fmtstr, Locale.UK);

return sdf.parse(datestr);

} catch (Exception e) {

return null;

}

}

/**

* 日期转化为String

* @param date

* @return date string

*/

private static String fmtDate(Date date) {

if (null == date) {

return null;

}

try {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);

return sdf.format(date);

} catch (Exception e) {

return null;

}

}

/**

* 判断是否存在某属性的 set方法

* @param methods

* @param fieldSetMet

* @return boolean

*/

private static boolean checkSetMet(Method[] methods, String fieldSetMet) {

for (Method met : methods) {

if (fieldSetMet.equals(met.getName())) {

return true;

}

}

return false;

}

/**

* 判断是否存在某属性的 get方法

* @param methods

* @param fieldGetMet

* @return boolean

*/

private static boolean checkGetMet(Method[] methods, String fieldGetMet) {

for (Method met : methods) {

if (fieldGetMet.equals(met.getName())) {

return true;

}

}

return false;

}

/**

* 拼接某属性的 get方法

* @param fieldName

* @return String

*/

private static String parGetName(String fieldName) {

if (null == fieldName || "".equals(fieldName)) {

return null;

}

return "get" + fieldName.substring(0, 1).toUpperCase()

+ fieldName.substring(1);

}

/**

* 拼接在某属性的 set方法

* @param fieldName

* @return String

*/

private static String parSetName(String fieldName) {

if (null == fieldName || "".equals(fieldName)) {

return null;

}

return "set" + fieldName.substring(0, 1).toUpperCase()

+ fieldName.substring(1);

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值