反射机制实现javaBeans自动赋值

本文介绍了一种使用反射机制自动复制JavaBeans属性的方法,避免了大量set和get操作带来的重复劳动,同时也提供了一种利用Introspector和PropertyDescriptor进行属性复制的备选方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发中常常遇到两个beans相同字段之间值传递中大量的x.setXXXX(y.getXXX())语句;
字段多了比较繁琐,所以在这里就利用反射机制实现自动赋值。
考虑反射机制的效率问题,字段不多就手动设置更好。

/**
* javaBeans自动将相同字段值赋给给另外一个javaBeans
* @param src
* @param target
* @throws Exception
*/
public static void CopyBeans2Beans(Object src, Object target) throws Exception {
Field[] srcFields = src.getClass().getDeclaredFields();

Method[] methods = target.getClass().getMethods();

for (Field field : srcFields) {

//不检查访问修饰符,如果有私有变量请一定要设置
field.setAccessible(true);
String methodName = "set"+field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1);
for (Method method : methods) {
if(methodName.equals(method.getName()))
method.invoke(target, field.get(src));
}
}

}


[b][color=red]另一种实现:[/color][/b]

public static void CopyBeans2Beans(Object from, Object to) {

try {
BeanInfo toBI = Introspector.getBeanInfo(to.getClass());
PropertyDescriptor[] toPD = toBI.getPropertyDescriptors();

BeanInfo fromBI = Introspector.getBeanInfo(from.getClass());
PropertyDescriptor[] fromPD = fromBI.getPropertyDescriptors();

HashMap<String, PropertyDescriptor> fromMap = new HashMap<String, PropertyDescriptor>();
for (PropertyDescriptor pd : fromPD)
fromMap.put(pd.getName(), pd);

for (PropertyDescriptor toP : toPD) {

Method setMethod = toP.getWriteMethod();

PropertyDescriptor formP = fromMap.get(toP.getName());
if (formP == null)// 如果from没有此属性的get方法,跳过
continue;

Method getMethod = fromMap.get(toP.getName()).getReadMethod();

if (getMethod != null && setMethod != null) {
Object result = getMethod.invoke(from);

if(result==null)
continue;

if(result.getClass()!= java.lang.String.class)
continue;
setMethod.invoke(to, result);
}
}
} catch (Exception e) {
e.printStackTrace();
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值