java利用反射交换两个对象中的字段相同的字段值
有时候我们的两个对象字段都是一样的,只有极少的区别,想要把一个对象字段的值,赋值给另外一个对象值
然后传给另外一个方法使用,但是这个字段太多,一个一个的复制太过繁琐。
这时候利用反射解决这个问题。
class TestObject1{
private Integer age;
private String name;
//特有的字段
private String weight;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
} }
class TestObject2{
private Integer age;
private String name;
//特有的字段
private String address;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
} }
编写test测试类
public class Test { /**
* origin字段向target转化
* @param origin
* @param target
* @return
*/
public static <T> T swap(Object origin,T target){
Field[] tFs = target.getClass().getDeclaredFields();//获得属性
Field[] oFs = origin.getClass().getDeclaredFields();//获得属性
for(int i=0;i<tFs.length;i++){
String tname=tFs[i].getName();
for(int j=0;j<oFs.length;j++){
if(oFs[j].getName().equals(tname)){
Object val=getValue(origin, tname);
setValue(target, tname, val);
}
}
}
return target;
}
/**
*
* @param beanObj 实体类
*/
private static Object getValue(Object beanObj,String name){
try {
Field[] fields = beanObj.getClass().getDeclaredFields();//获得属性
Class clazz = beanObj.getClass();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String names=field.getName();
if(!names.equals(name)){
continue;
}
// 此处应该判断beanObj,property不为null
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
Method getMethod = pd.getReadMethod();
if (getMethod != null) {
//System.out.println(beanObj+"的字段是:"+field.getName()+",类型是:"+field.getType()+",取到的值是: "+getMethod.invoke(beanObj));
return getMethod.invoke(beanObj);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
*
* @param beanObj 实体类
* @param name 字段名
* @param value 值
*/
private static void setValue(Object beanObj,String name,Object value){
try {
Field[] fields = beanObj.getClass().getDeclaredFields();//获得属性
Class clazz = beanObj.getClass();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String names=field.getName();
if(!names.equals(name)){
continue;
} PropertyDescriptor pd = new PropertyDescriptor(field.getName(), beanObj.getClass());
Method setMethod = pd.getWriteMethod();
if (setMethod != null) {
setMethod.invoke(beanObj, value);
}
}
} catch (Exception e) {
e.printStackTrace();
}
} }
编写main方法
public static void main(String[] args) {
TestObject1 test1=new TestObject1();
test1.setAge(22);
test1.setName("gys");
TestObject2 test2=swap(test1,new TestObject2());
System.out.println(test2.getName()); }
java利用反射交换两个对象中的字段相同的字段值的更多相关文章
- java通过反射拷贝两个对象的同名同类型变量
深拷贝和浅拷贝 首先对象的复制分为深拷贝和浅拷贝,关于这两者的区别,简单来说就是对于对象的引用,在拷贝的时候,是否会新开辟一块内存,还是直接复制引用. 两者的比较也有很多,具体可以看这篇文章: htt ...
- [转]C#利用反射实现两个类的对象之间相同属性的值的复制
本文转自:https://blog.csdn.net/u013093547/article/details/53584591 在使用c#进行程序编写时,会遇到一个问题,两个属性字段差不多相同的类要进行 ...
- Java反射交换两个整型变量的值
在一次面试中,做了这么一道题"交换两个整型变量的值",当时看到这个题目之后,会心一笑,这也太简单了--直接使用中间变量交换不就可以了吗?但是,面试官却说不需要返回值,在调用的地方, ...
- java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值
1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...
- 【转】Java利用反射机制访问私有化构造器
Java利用反射机制访问私有化构造器 博客分类: java 我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...
- java利用反射调用类的某个方法
java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...
- java利用反射获取类的属性及类型
java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...
- DataTable和DataRow利用反射直接转换为Model对象的扩展方法类
DataTable和DataRow利用反射直接转换为Model对象的扩展方法类 /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为 ...
- C#比较两个对象中的指定字段值是否相等
一.创建CompareFieldAttribute标识要比较的字段 using System; namespace CompareObjField { /// <summary> /// ...
随机推荐
- Findout之为什么公司内部不能使用SSH协议连接外网服务器
今天在公司学习Linux的过程中,想试着像在Windows中操作Github一样对代码进行克隆,只不过是使用命令行的方式.根据一篇博文(Linux下初次使用Github配置)进行了配置,当我进行到第二 ...
- UI中的Rect Transform
RectTransform 是 Transform 的 2D 对应 Component. Transform 表示单个点,Rect Transform 表示一个2D矩形(UI空间),如果父子物体都有R ...
- socket 简单了解
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的 ...
- angular 实现左侧和顶部固定定位布局
1 布局基于angular ng-zorro组件库实现 由于项目中使用了组件库并且要求响应式布局,卡在这个坑上两天,多次调试后终于解决 代码仅供参考,由于没有上传依赖的库和组件包无法直接运行,提供代码 ...
- 运行Tomcat报错 解决方法
The APR based Apache Tomcat Native library which allows optimal performance in production environmen ...
- 小妖精的完美游戏教室——东方PROJECT,同人,th12灵梦A
╮(╯▽╰)╭没办法,小妖精Balous也很讨厌学院化的教育呀,一点意义都没有. 这次就上传东方地灵殿灵梦A逻辑部分的核心代码吧,估计连老师都看不懂.动画部分的代码就不放上来了. //======== ...
- MySQL_DML语言
#MySQL--DML语言##SQL组成DDL:数据库模式定义语言,关键字:create DML:数据操纵语言,关键字:insert,delete,update DCL:数据库控制语言,关键字:gra ...
- qt+opencv 构建项目时报错——no such file or directory
构建前,记得,一定一定一定要先点击执行qmake:
- eclipse与visualVM与mat
GC与CPU与内存的查看与分析 本文主要讲visualVM,MAT的下载配置;以及如何运用visualVM生成hprof文件;如何用visualVM分析CPU消耗,程序瓶颈在哪里;怎么用MAT导入hp ...
- angular1中ng-repeat效率优化方法:
1.当 ng-repeat 的数组被替换时, 它默认并不会重新利用已有的 Dom 元素,而是直接将其全部删除并重新生成新的数组 Dom 元素: 2.Dom 的频繁操作是非常不友好的, ng-repea ...