日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java反射设置list的属性值_利用java反射比较两个实体有哪些属性值不一样

發布時間:2024/8/23 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java反射设置list的属性值_利用java反射比较两个实体有哪些属性值不一样 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分享一個利用反射實現比較兩個實體屬性值的方法:

package net.zwq1105.test;

import java.beans.Introspector;

import java.beans.PropertyDescriptor;

import java.lang.reflect.Method;

import java.sql.Timestamp;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Set;

/**

* 類說明:比較兩個實體的有哪些屬性值不同

* @author zwq1105

* @version 創建時間:2017-3-4 下午16:30:36

*/

public class TestCompareFields {

public static void main(String[] args) {

Student s1 = new Student("123", "張三", 22, "深圳");

Student s2 = new Student("abc", "李四", 23, "深圳");

// 比較s1和s2不同的屬性值,其中id忽略比較

Map> compareResult = compareFields(s1, s2, new String[]{"id"});

System.out.println("s1和s2共有" + compareResult.size() + "個屬性值不同(不包括id)");

System.out.println("其中:");

Set keySet = compareResult.keySet();

for(String key : keySet){

List list = compareResult.get(key);

System.out.println(">>> s1的" + key + "為" + list.get(0) + ",s2的" + key + "為" + list.get(1));

}

}

/**

* 比較兩個實體屬性值,返回一個map以有差異的屬性名為key,value為一個list分別存obj1,obj2此屬性名的值

* @param obj1 進行屬性比較的對象1

* @param obj2 進行屬性比較的對象2

* @param ignoreArr 選擇忽略比較的屬性數組

* @return 屬性差異比較結果map

*/

@SuppressWarnings("rawtypes")

public static Map> compareFields(Object obj1, Object obj2, String[] ignoreArr) {

try{

Map> map = new HashMap>();

List ignoreList = null;

if(ignoreArr != null && ignoreArr.length > 0){

// array轉化為list

ignoreList = Arrays.asList(ignoreArr);

}

if (obj1.getClass() == obj2.getClass()) {// 只有兩個對象都是同一類型的才有可比性

Class clazz = obj1.getClass();

// 獲取object的屬性描述

PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,

Object.class).getPropertyDescriptors();

for (PropertyDescriptor pd : pds) {// 這里就是所有的屬性了

String name = pd.getName();// 屬性名

if(ignoreList != null && ignoreList.contains(name)){// 如果當前屬性選擇忽略比較,跳到下一次循環

continue;

}

Method readMethod = pd.getReadMethod();// get方法

// 在obj1上調用get方法等同于獲得obj1的屬性值

Object o1 = readMethod.invoke(obj1);

// 在obj2上調用get方法等同于獲得obj2的屬性值

Object o2 = readMethod.invoke(obj2);

if(o1 instanceof Timestamp){

o1 = new Date(((Timestamp) o1).getTime());

}

if(o2 instanceof Timestamp){

o2 = new Date(((Timestamp) o2).getTime());

}

if(o1 == null && o2 == null){

continue;

}else if(o1 == null && o2 != null){

List list = new ArrayList();

list.add(o1);

list.add(o2);

map.put(name, list);

continue;

}

if (!o1.equals(o2)) {// 比較這兩個值是否相等,不等就可以放入map了

List list = new ArrayList();

list.add(o1);

list.add(o2);

map.put(name, list);

}

}

}

return map;

}catch(Exception e){

e.printStackTrace();

return null;

}

}

}

/**

* 學生orm

* @author zwq1105

*/

class Student{

private String id;

private String name;

private int age;

private String city;

public Student(String id, String name, int age, String city) {

this.id = id;

this.name = name;

this.age = age;

this.city = city;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getCity() {

return city;

}

public void setCity(String city) {

this.city = city;

}

}

執行結果:

某些類型的比較可能還存在問題,歡迎指出問題相互討論。

總結

以上是生活随笔為你收集整理的Java反射设置list的属性值_利用java反射比较两个实体有哪些属性值不一样的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。