java反射机制给实体类相同字段自动赋值实例
一、封装一个工具类
1、简易版
packagenet.aexit.construct.acceptance.websky.utils;
importjava.lang.reflect.Field;
importjava.lang.reflect.Method;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.Map;
publicclassClassReflection{
/**
*@paramclass1用于赋值的实体类
*@paramclass2需要待赋值的实体类
*描述:反射实体类赋值
*/
publicstaticvoidreflectionAttr(Objectclass1,Objectclass2)throwsException{
Classclazz1=class1.getClass();
Classclazz2=class2.getClass();
//获取两个实体类的所有属性
Field[]fields1=clazz1.getDeclaredFields();
Field[]fields2=clazz2.getDeclaredFields();
//遍历class1Bean,获取逐个属性值,然后遍历class2Bean查找是否有相同的属性,如有相同则赋值
for(Fieldf1:fields1){
if(f1.getName().equals("id"))
continue;
//设置访问权限
f1.setAccessible(true);
Objectvalue=f1.get(class1);
for(Fieldf2:fields2){
if(f1.getName().equals(f2.getName())){
//设置访问权限
f2.setAccessible(true);
f2.set(class2,value);
}
}
}
}
}
2、复杂版
packagenet.utils;
importjava.lang.reflect.Field;
importjava.lang.reflect.Method;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.Map;
publicclassClassReflection{
/**
*@paramclass1用于赋值的实体类
*@paramclass2需要待赋值的实体类
*描述:反射实体类赋值
*/
publicstaticvoidreflectionAttr(Objectclass1,Objectclass2)throwsException{
Classclazz1=Class.forName(class1.getClass().getName());
Classclazz2=Class.forName(class2.getClass().getName());
//获取两个实体类的所有属性
Field[]fields1=clazz1.getDeclaredFields();
Field[]fields2=clazz2.getDeclaredFields();
ClassReflectioncr=newClassReflection();
//遍历class1Bean,获取逐个属性值,然后遍历class2Bean查找是否有相同的属性,如有相同则赋值
for(Fieldf1:fields1){
if(f1.getName().equals("id"))
continue;
Objectvalue=cr.invokeGetMethod(class1,f1.getName(),null);
for(Fieldf2:fields2){
if(f1.getName().equals(f2.getName())){
Object[]obj=newObject[1];
obj[0]=value;
cr.invokeSetMethod(class2,f2.getName(),obj);
}
}
}
}
/**
*
*执行某个Field的getField方法
*@paramclazz类
*@paramfieldName类的属性名称
*@paramargs参数,默认为null
*@return
*/
publicObjectinvokeGetMethod(Objectclazz,StringfieldName,Object[]args){
StringmethodName=fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
Methodmethod=null;
try
{
method=Class.forName(clazz.getClass().getName()).getDeclaredMethod("get"+methodName);
returnmethod.invoke(clazz);
}
catch(Exceptione)
{
e.printStackTrace();
return"";
}
}
/**
*
*执行某个Field的setField方法
*@paramclazz类
*@paramfieldName类的属性名称
*@paramargs参数,默认为null
*@return
*/
publicObjectinvokeSetMethod(Objectclazz,StringfieldName,Object[]args)
{
StringmethodName=fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
Methodmethod=null;
try
{
Class[]parameterTypes=newClass[1];
Classc=Class.forName(clazz.getClass().getName());
Fieldfield=c.getDeclaredField(fieldName);
parameterTypes[0]=field.getType();
method=c.getDeclaredMethod("set"+methodName,parameterTypes);
returnmethod.invoke(clazz,args);
}
catch(Exceptione)
{
e.printStackTrace();
return"";
}
}
//map转换为json字符串
publicstaticStringhashMapToJson(HashMapmap){
Stringstring="{";
for(Iteratorit=map.entrySet().iterator();it.hasNext();){
Map.Entrye=(Map.Entry)it.next();
string+="'"+e.getKey()+"':";
string+="'"+e.getValue()+"',";
}
string=string.substring(0,string.lastIndexOf(","));
string+="}";
returnstring;
}
}
二、调用工具类
ClassReflection.reflectionAttr(class1,class2);
三、赋值完成
注意:
1、id不赋值,主要给数据库两张表赋值,比如当前表和历史表,把当前表的相同字段的值赋值给历史表
2、简单版设置private修饰的字段可以被访问
补充知识:利用java反射原理给实体类注值
写一个通用java注值的方法,使用泛型T,将其封装在DbHelp中(相信DbHelper不用我解释是什么),使dao调用直接获取所需要的对象,也正应用了我们java面向对象的思想
publicstaticTgetBean(Stringsql,Class clazz){ Method[]ms=clazz.getDeclaredMethods(); Tt=null; try{ t=clazz.newInstance(); for(Methodm:ms){ Stringmn=m.getName(); if(mn.startsWith("set")){ Objectobj=map.get((mn.replace("set","").toUpperCase()));//取到set方法对应数据库字段的值 Stringpt=m.getParameterTypes()[0].toString();//取到set方法的参数类型 if(obj!=null){ if(pt.endsWith("int")||pt.endsWith("Integer")){ m.invoke(t,((BigDecimal)obj).intValue()); }elseif(pt.endsWith("Double")||pt.endsWith("double")){ m.invoke(t,((BigDecimal)obj).doubleValue()); }elseif(pt.endsWith("Date")){ m.invoke(t,(Timestamp)obj); }else{ m.invoke(t,obj); } } } } }catch(InstantiationException|IllegalAccessException|IllegalArgumentException|InvocationTargetExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } returnt; }
以上这篇java反射机制给实体类相同字段自动赋值实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。