一、封装一个工具类

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

}else {

m.invoke(t, obj);

}

}

}

}

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

// TODO Auto-generated catch block

e.printStackTrace();

}

return t;

}

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

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

  1. java反射更改方法内容_Java反射

    类的加载 java运行的都是类 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现这个类进行初始化. 加载 加载,是指Java虚拟机查找字节流(查找.class ...

  2. 解决springdatajpa 在解析实体类的字段时候驼峰自动转为下划线问题

    解决springdatajpa 在解析实体类的字段时候驼峰自动转为下划线问题 问题描述 springboot 在配置jpa时,利用idea自带工具逆向工程生成实体类,结果在调用findOne的时候,报 ...

  3. mybatisplus 实体类的字段名与数据库的字段名不一致的解决办法

    我们在查询数据库时经常会碰到数据库的字段名与实体类的字段名不一致的情况,例如报如下的错误 使用mybatisplus可以使用以下几种方式进行字段名的匹配: 把实体类的字段名改成和数据库的字段名一致,当 ...

  4. springboot项目中一个实体类引用其它实体类的字段并显示到页面上

    1.需要在该实体类中添加引用实体类的字段,并添加getter和setter方法,并添加@Transient注解,或者使用@TableField(exist = false)注解.如下图: 2.在map ...

  5. 设置实体类中字段为非数据库字段

    设置实体类中字段为非数据库字段,加以下注解: @TableField(exist = false) 是不是数据库字段:true是:false不是 源码:不设置则默认是数据库字段

  6. java反射有什么用_java反射的作用知识点总结

    Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在.灵活掌握Java反射机制,对大家以后学习框架技术有很大的帮助. 什么是Java的反射? 反射是Java的特征之一,是一种间接操作 ...

  7. java反射为什么消耗资源_Java反射笔记

    第一:先认识Class类 类也是一种实例,类的实例创建有三种方式. 类的实例对象创建的方式有两种.以下的代码详细的介绍: packagecom.company;import java.util.*;p ...

  8. java 反射 慢在那里_Java 反射到底慢在哪?

    反射具体是怎么影响性能的?这引起了我的反思. 是啊,在阐述某个观点时确实有必要说明原因,并且证明这个观点是对的,虽然反射影响性能人尽皆知,我曾经也真的研究过反射是否存在性能问题,但并没有在写文章的时候 ...

  9. java反射消耗性能吗_JAVA反射会降低你的程序性能吗?

    早两天写了<从把三千行代码重构成15行代码谈起>这篇文章,看到评论中有一些同学的回复还是在质疑反射的性能,好像程序用上了反射,就像开上了拖拉机似的.本来我觉得这个话题没有什么好讨论的了,网 ...

最新文章

  1. adguard没有核心 core no_Spring 核心组件原理解析
  2. java函数式编程_说说函数式编程的那些事
  3. delphi中保留字的属性和含义
  4. kafka最好用的脚本一:kafka-topic
  5. C++调用.lib的方法
  6. 在Visio里加上、下标方法
  7. 数据库(MySQL)基础快速入门!
  8. 饥荒联机一直显示正在启动服务器,饥荒联机版启动服务器时间长 | 手游网游页游攻略大全...
  9. oracle数据库中文乱码解决办法
  10. python中[::-1][1:2][1::2]的用法
  11. Golang——Go语言发展史(一)
  12. 编码器输出:HTL、TTL
  13. macos无法使用sudo_如何在macOS上使用Touch ID运行Sudo命令
  14. Linux线程操作以及相关知识
  15. 如何用看板工具做轻量级项目管理
  16. 【Python数据科学手册】Pandas——十二、处理时间序列
  17. 瓷砖铺贴方法_5种常见的瓷砖铺贴以及施工方法介绍
  18. 【社会网络分析_04】ucinet中心度密度测量与凝聚子群发现
  19. BUUCTF 世上无难事
  20. 交互模型你快跑,双塔要卷过来了

热门文章

  1. R语言与非参数检验之两独立样本中位数检验
  2. windows 10 使用 VMWare workstation player 启动 windows XP 虚拟机出错的问题
  3. 如何将 winston log 库记录的日志写入 mongo DB 数据库
  4. 为什么我们需要给 Angular library 创建多重入口 multiple entry point
  5. Angular Jasmine单元测试用例spec.ts的加载逻辑
  6. 一步步创建ABAP post exit增强
  7. SAP云平台上的Low Code Development(低代码开发)解决方案
  8. json格式的字符串序列化和反序列化的一些高级用法
  9. C4C微信集成 - agent在C4C系统回复,微信用户在微信端直接收到
  10. how does Fiori Mock server serve OData request with 202