java反射机制给实体类相同字段自动赋值实例

网友投稿 631 2022-11-26


java反射机制给实体类相同字段自动赋值实例

一、封装一个工具类

1、简易版

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、复杂版

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;

}

}

二、调用工具类

ClassReflection.reflectionAttr(class1, class2);

三、赋值完成

注意:

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

2、简单版设置private修饰的字段可以被访问

补充知识:利用java反射原理给实体类注值

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

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);

}elsmmVowGCe {

m.invoke(t, obj);

}

}

}

}

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

// TODO Auto-generated catch block

e.printStackTrace();

}

return t;

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java 通过反射给实体类赋值操作
下一篇:Java实体类(entity)作用说明
相关文章

 发表评论

暂时没有评论,来抢沙发吧~