最近和Java的反射打交道比较多一点,可能是因为自己以后的方向是架构师的缘故吧,他们主要搞业务。我能也就搞架构,整天画一些流程图。

虽然对于只有一年实习经验的我,不知道这样是否好,但是我还是那句话,不论好坏,先走着,毕竟也能学到很多东西,而且还可以锻炼自己的思维能力。

表达能力,因为自己的产品做的再好,你就是表达不出来,说不出来优势,那么你就败了。

先创建一个实体类User

package com.mine.practice.copyproperty.entity;

/**

*

* @author 2014-11-6 上午10:28:10

* @version V1.0

*/

public class User {

private int id;

private String name;

private String pwd;

private double idG;

public double getIdG() {

return idG;

}

public void setIdG(double idG) {

this.idG = idG;

}

public String getPwd() {

return pwd;

}

public void setPwd(String pwd) {

this.pwd = pwd;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

然后就是具体的拷贝已经测试代码了。

package com.mine.practice.copyproperty.test;

import java.lang.reflect.Field;

import com.mine.practice.copyproperty.entity.User;

/**

* 属性拷贝

* @author 2014-11-6 上午10:29:32

*/

public class TestCopyProperty {

/**

* 业务需求:

* 对于某些业务进行某个或某些类的数据更新时,只想更新该类的部分字段,其它字段还使用之前的值。

*

* 遇到问题:

* 当有些业务需要增加或减少某个类的字段个数、修改字段名称时,前台可能只需要修改一个地方就可以解决了。

* 但是后台由于采用的事件的方式进行处理,所以会有多个地方使用,修改起来比较困难。

*

* 主要解决问题:

* 即使字段个数或者字段名称修改后后台代码也不需要修改。

*

* 解决方案:

* 在借鉴之前的解决方案的基础上进行了修改。

* 通过遍历该类的所有属性,然后获取新类的属性值,如果新类的属性值不为null、空字符串、基本类型的默认值

* 则把新的对象的属性值赋值给老的对象属性

*

* 优点:1、即使增加或者修改字段个数后台也不需要改动

* 2、即使修改字段名称或者类型后台也不需要改动

*

* 缺点:1、会遍历一个类的所有属性,并且判断新对象的属性值:是否存在以及是否为默认值。批量数据时性能会有些差

* 2、由于基本数据类型会有默认值,所以框架不知道这个字段的值到底要不要修改到新的对象上面。

*

*

* @author 2014-11-6 上午11:01:03

* @param args

* @throws SecurityException

* @throws NoSuchFieldException

* @throws IllegalArgumentException

* @throws IllegalAccessException

* @modificationHistory=========================逻辑或功能性重大变更记录

* @modify by user: {修改人} 2014-11-6

* @modify by reason:{原因}

*/

public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {

//老对象

User oldUser = new User();

oldUser.setId(1);

oldUser.setName("name1");

oldUser.setPwd("pwd1");

oldUser.setIdG(1.2);

System.out.println("数据库中的老对象");

print(oldUser);

//新对象

User newUser = new User();

newUser.setName("name2");

System.out.println("前台传递过来的新对象");

print(newUser);

//功能需求

//把之前的老对象的id和name修改掉,但是pwd不需要修改

copyProperty(oldUser,newUser);

System.out.println("----------老对象被修改后-------------");

print(oldUser);

}

/**

*

* @author 2014-11-6 上午11:26:36

* @param oldUser

* @param newUser

* @throws NoSuchFieldException

* @throws SecurityException

* @throws IllegalAccessException

* @throws IllegalArgumentException

* @modificationHistory=========================逻辑或功能性重大变更记录

* @modify by user: {修改人} 2014-11-6

* @modify by reason:{原因}

*/

@SuppressWarnings("rawtypes")

private static void copyProperty(User oldUser,User newUser) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{

//新的class

Class newClass = newUser.getClass();

//老的class

Class oldClass = oldUser.getClass();

//该类所有的属性

Field[] newFields = newClass.getDeclaredFields();

//新的属性

Field newField = null;

//老的属性

Field oldField = null;

for(Field f : newFields){

//类中的属性名称

String fieldName = f.getName();

//通过属性名称获取属性

newField = newClass.getDeclaredField(fieldName);

//获取属性的值时需要设置为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。

//值为 false 则指示反射的对象应该实施 Java 语言访问检查。

newField.setAccessible(true);

//根据属性获取对象上的值

Object newObject = newField.get(newUser);

//过滤空的属性或者一些默认值

if (isContinue(newObject)) {

continue;

}

oldField = oldClass.getDeclaredField(fieldName);

oldField.setAccessible(true);

oldField.set(oldUser, newObject);

}

}

/**

* 是否跳出本次循环

* @author 2014-11-6 上午11:37:22

* @param object

* @return true 是 有null或者默认值

* false 否 有默认值

*/

private static boolean isContinue(Object object){

if (object == null || "".equals(object)) {

return true;

}

String valueStr = object.toString();

if ("0".equals(valueStr) || "0.0".equals(valueStr)) {

return true;

}

return false;

}

/**

*

* @author 2014-11-6 上午10:57:32

* @param user

*/

private static void print(User user){

System.out.println("id: "+user.getId());

System.out.println("name: "+user.getName());

System.out.println("pwd: "+user.getPwd());

System.out.println("idG: "+user.getIdG());

}

}

功能简单,但是学习到了一些新知识还是很开森的。

java 对象拷贝属性_使用Java对两个对象的属性进行拷贝相关推荐

  1. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  2. java数组最大下标_【Java视频教程】day09-面向对象

    面向对象介绍 面向对象引入 需求:求数组{1,2,3,4,8,7,6,5}的最大值: public static void main(String[] args) {// 需求:求数组{1,2,3,4 ...

  3. java对象工厂池_[转载]Java对象池技术的原理及其实现

    作者:汪永好 出处:计算机与信息技术 责任编辑: 方舟 [ 2006-11-25 07:00 ] 摘 要 :本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术 ...

  4. java 对象复制 反射_利用Java反射机制实现对象相同字段的复制操作

    一.如何实现不同类型对象之间的复制问题? 1.为什么会有这个问题? 近来在进行一个项目开发的时候,为了隐藏后端数据库表结构.同时也为了配合给前端一个更友好的API接口文档(swagger API文档) ...

  5. java继承数组实例_【Java】理解封装、继承、多态和对象数组的综合实例(简易的租车系统,附代码)...

    一.Drive.java(汽车类 - 父类) package Z_CarManger; import java.io.ObjectInputStream.GetField; public abstra ...

  6. java 反射创建属性_使用Java反射机制确定基本数据类型属性

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Java反射机制提供了一种强大的应用程序接口来帮助我们在运行时检测和执行对象上的操作.该机制允许程序员审视一个未知对象,并且获得它的属性,例如对象上的方法 ...

  7. java处理json字符串_常见java对象转换为json字符串处理!!!

    1.JSON简介 1. 概念: JavaScript Object NotationJavaScript对象表示法 Person p = new Person(); p.setName("张 ...

  8. java打印对象头信息_打印Java对象头

    打印Java对象头 对象头形式 JVM中对象头的方式有以下两种(以32位JVM为例)普通对象|----------------------------------------------------- ...

  9. java 抽象 属性_在java中如何定义一个抽象属性示例详解

    前言 本文主要给大家介绍的是在java中定义一个抽象属性的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: Abstract关键字通常被用于类和方法,用来把某些行为的实现委托给 ...

  10. java synchronized 类锁_【java】synchronized对象锁和类锁简介【图文教程】

    平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...

最新文章

  1. Latex(一)公式自动编号与自动引用
  2. Java自带的常用工具
  3. php过滤手机特殊字符,php过滤特殊字符实用函数
  4. oracle性能优化总结
  5. linux ndk编译静态库,Android开发教程:NDK编译静态库失败
  6. 记录 FreeBSD
  7. 10.1.3 标签分类与嵌套
  8. 三星Note2 行货 水货 型号版本
  9. 数据库事务隔离级别-- 脏读、幻读、不可重复读(清晰解释)
  10. 【超全指南】Java 8 中使用 Optional 处理 null 对象
  11. python filecmp
  12. 用户故事 | 刷算法面试题的4种思考方式
  13. vue computed 传参_Vue的构造选项
  14. matlab两个运动同时进行,多体运动的matlab动画演示
  15. proxy代理服务器的代码实现
  16. c语言曲率计算,曲率及其曲率半径及计算.ppt
  17. Python学习笔记-北京图灵学院-Python概述-20200525
  18. 论文解读--Multi-class Road User Detection with 3+1D Radar in the View-of-Delft Dataset
  19. 【关系抽取】TPLinker:单阶段联合抽取,并解决暴漏偏差
  20. SpringBoot-端点详解

热门文章

  1. AR# 58294 Zynq-7000 SoC: PS SPI 控制器文档升级
  2. 2.3.4 操作系统之信号量机制(整型信号量、记录型信号量P、V)
  3. Http / Get 和 Post 区别
  4. Cpp 11 / 万能引用、引用折叠和完美转发
  5. 低电压瞬态抑制二极管,有哪些常用的型号?
  6. windows文件 linux cr,DOS/Windows和Linux/Unix间的文件格式转换
  7. python网络爬虫基础知识_Python网络爬虫基础知识
  8. EBS ORACLE使用API批量取消销售订单
  9. 2019 湖南多校第五场题解
  10. 转:Webkit Flex伸缩盒模型属性备忘