javabean反射改字段内容_java反射机制给实体类相同字段自动赋值实例

一、封装一个工具类PgM免费资源网

1、简易版PgM免费资源网

package net.aexit.construct.acceptance.websky.utils;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

public class ClassReflection {

/**

* @param class1 用于赋值的实体类

* @param class2 需要待赋值的实体类

* 描述:反射实体类赋值

*/

public static void reflectionAttr(Object class1,Object class2) throws Exception{

Class clazz1 = class1.getClass();

Class clazz2 = class2.getClass();

// 获取两个实体类的所有属性

Field[] fields1 = clazz1.getDeclaredFields();

Field[] fields2 = clazz2.getDeclaredFields();

// 遍历class1Bean,获取逐个属性值,然后遍历class2Bean查找是否有相同的属性,如有相同则赋值

for (Field f1 : fields1) {

if(f1.getName().equals("id"))

continue;

//设置访问权限

f1.setAccessible(true);

Object value = f1.get(class1);

for (Field f2 : fields2) {

if(f1.getName().equals(f2.getName())){

//设置访问权限

f2.setAccessible(true);

f2.set(class2,value);

}

}

}

}

}

2、复杂版PgM免费资源网

package net.utils;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

public class ClassReflection {

/**

* @param class1 用于赋值的实体类

* @param class2 需要待赋值的实体类

* 描述:反射实体类赋值

*/

public static void reflectionAttr(Object class1,Object class2) throws Exception{

Class clazz1 = Class.forName(class1.getClass().getName());

Class clazz2 = Class.forName(class2.getClass().getName());

// 获取两个实体类的所有属性

Field[] fields1 = clazz1.getDeclaredFields();

Field[] fields2 = clazz2.getDeclaredFields();

ClassReflection cr = new ClassReflection();

// 遍历class1Bean,获取逐个属性值,然后遍历class2Bean查找是否有相同的属性,如有相同则赋值

for (Field f1 : fields1) {

if(f1.getName().equals("id"))

continue;

Object value = cr.invokeGetMethod(class1 ,f1.getName(),null);

for (Field f2 : fields2) {

if(f1.getName().equals(f2.getName())){

Object[] obj = new Object[1];

obj[0] = value;

cr.invokeSetMethod(class2, f2.getName(), obj);

}

}

}

}

/**

*

* 执行某个Field的getField方法

* @param clazz 类

* @param fieldName 类的属性名称

* @param args 参数,默认为null

* @return

*/

public Object invokeGetMethod(Object clazz, String fieldName, Object[] args) {

String methodName = fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);

Method method = null;

try

{

method = Class.forName(clazz.getClass().getName()).getDeclaredMethod("get" + methodName);

return method.invoke(clazz);

}

catch (Exception e)

{

e.printStackTrace();

return "";

}

}

/**

*

* 执行某个Field的setField方法

* @param clazz 类

* @param fieldName 类的属性名称

* @param args 参数,默认为null

* @return

*/

public Object invokeSetMethod(Object clazz, String fieldName, Object[] args)

{

String methodName = fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);

Method method = null;

try

{

Class[] parameterTypes = new Class[1];

Class c = Class.forName(clazz.getClass().getName());

Field field = c.getDeclaredField(fieldName);

parameterTypes[0] = field.getType();

method = c.getDeclaredMethod("set" + methodName,parameterTypes);

return method.invoke(clazz,args);

}

catch (Exception e)

{

e.printStackTrace();

return "";

}

}

//map转换为json字符串

public static String hashMapToJson(HashMap map) {

String string = "{";

for (Iterator it = map.entrySet().iterator(); it.hasNext();) {

Map.Entry e = (Map.Entry) it.next();

string += "'" + e.getKey() + "':";

string += "'" + e.getValue() + "',";

}

string = string.substring(0, string.lastIndexOf(","));

string += "}";

return string;

}

}

二、调用工具类PgM免费资源网

ClassReflection.reflectionAttr(class1, class2);PgM免费资源网

三、赋值完成PgM免费资源网

注意:PgM免费资源网

1、id不赋值,主要给数据库两张表赋值,比如当前表和历史表,把当前表的相同字段的值赋值给历史表PgM免费资源网

2、简单版设置private修饰的字段可以被访问PgM免费资源网

补充知识:利用java反射原理给实体类注值PgM免费资源网

写一个通用java注值的方法,使用泛型T,将其封装在DbHelp中(相信DbHelper不用我解释是什么),使dao调用直接获取所需要的对象,也正应用了我们java面向对象的思想PgM免费资源网

public static T getBean(String sql,Class clazz){

Method[] ms=clazz.getDeclaredMethods();

T t=null;

try {

t=clazz.newInstance();

for (Method m : ms) {

String mn=m.getName();

if(mn.startsWith("set")){

Object obj=map.get((mn.replace("set", "").toUpperCase()));//取到set方法对应数据库字段的值

String pt=m.getParameterTypes()[0].toString();//取到set方法的参数类型

if(obj!=null){

if(pt.endsWith("int")||pt.endsWith("Integer")){

m.invoke(t, ((BigDecimal)obj).intValue());

}else if(pt.endsWith("Double")||pt.endsWith("double")){

m.invoke(t, ((BigDecimal)obj).doubleValue());

}else if(pt.endsWith("Date")){

m.invoke(t, (Timestamp)obj);

}else {

m.invoke(t, obj);

}

}

}

}

} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return t;

}

以上这篇java反射机制给实体类相同字段自动赋值实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持免费资源网。PgM免费资源网

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值