1. 程式人生 > >java利用反射完成不同類之間相同屬性的複製

java利用反射完成不同類之間相同屬性的複製

如果我們有兩個不同的類物件,但他們具有相同的屬性,我們怎麼將一個物件的屬性值複製給另外一個物件呢?
我們可以利用反射完成這個需求:首先我們利用反射得到兩個物件的所有屬性,再通過迴圈得到源物件(被複制的物件)每個屬性值,然後再將值複製給目標物件(複製的物件)的屬性。

源物件的類:

public class UserSource {
 
    private String name;
    
    private int age;
    
    private String address;
 
    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 getAddress() {
        return address;
    }
 
    public void setAddress(String address) {
        this.address = address;
    }
}
 

目標物件的類:

public class UserTarget {
 
    private String name;
    
    private int age;
 
    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;
    }
}

接下來,就是複製屬性的操作程式碼:

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
public class CopyProperties {
 
    public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
        UserSource source = new UserSource();
        UserTarget target = new UserTarget();
        
        source.setAge(23);
        source.setName("hao");
        source.setAddress("gd");
        
        copy(source, target);
        
        System.out.println("Name:" + target.getName());
        System.out.println("Age:" + target.getAge());
    }
    
    /**
     * 複製源物件和目標物件的屬性值
     *
     */
    public static void copy(Object source, Object target) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
        
        Class sourceClass = source.getClass();//得到物件的Class
        Class targetClass = target.getClass();//得到物件的Class
        
        Field[] sourceFields = sourceClass.getDeclaredFields();//得到Class物件的所有屬性
        Field[] targetFields = targetClass.getDeclaredFields();//得到Class物件的所有屬性
        
        for(Field sourceField : sourceFields){
            String name = sourceField.getName();//屬性名
            Class type = sourceField.getType();//屬性型別
            
            String methodName = name.substring(0, 1).toUpperCase() + name.substring(1);
            
            Method getMethod = sourceClass.getMethod("get" + methodName);//得到屬性對應get方法
            
            Object value = getMethod.invoke(source);//執行源物件的get方法得到屬性值
            
            for(Field targetField : targetFields){
                String targetName = targetField.getName();//目標物件的屬性名
                
                if(targetName.equals(name)){
                    Method setMethod = targetClass.getMethod("set" + methodName, type);//屬性對應的set方法
                    
                    setMethod.invoke(target, value);//執行目標物件的set方法
                }
            }
        }
    }
}

執行結果:

Name:hao
Age:23
 

相關推薦

java利用反射完成同類之間相同屬性複製

如果我們有兩個不同的類物件,但他們具有相同的屬性,我們怎麼將一個物件的屬性值複製給另外一個物件呢? 我們可以利用反射完成這個需求:首先我們利用反射得到兩個物件的所有屬性,再通過迴圈得到源物件(被複制的物件)每個屬性值,然後再將值複製給目標物件(複製的物件)的屬性。 源物件的

Java利用反射實現物件之間相同屬性複製

package com.utils; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; import java.util.List; /** *

利用java反射實現兩個具有相同屬性bean賦值

import java.lang.reflect.Field; import java.lang.reflect.Method; public class ClassReflection { /** * @param class1 用於賦值的實體類

JAVA利用反射映射JSON對象為JavaBean

comment 反射 ati 利用反射 一個 start board 對象 映射 關於將JSONObject轉換為JavaBean,其實在JSONObject中有對於的toBean()方法來處理,還可以根據給定的JsonCon

java利用反射將pojo轉為json對象

需要 ktr OS reflect res pojo json.js code substring 最近做以太坊錢包項目需要與前臺進行json交互,寫一個工具類,經普通javaBean轉為json對象 1 package util; 2 3 import java

egret 同類之間相互呼叫以及事件偵聽

Main類 class Main extends eui.Component { public constructor() { super(); } public childrenCreated() { super.c

pyqt4同類之間訊號與槽進行連線

這個部落格是自己在使用pyqt4過程中,解決具體的總結,僅供個人備忘。 不同類之間訊號與槽的對應,需要三個步驟: 1)在類A裡定義發射訊號,使用emit()方法,發射訊號A_signal(); 2)在類B裡定義槽函式B_slot(); 3)在主函式main()裡,使用

java 利用反射建立執行時類的物件

java 利用反射建立執行時類的物件 1. java 利用反射建立執行時類的物件 1.1. 建立類的物件:呼叫Class物件的newInstance()方法 2.例子demo 3. 反

C#用反射實現兩個類的物件之間相同屬性的值的複製

在進行實體轉換操作的時候如果需要在對兩個實體之間兩個屬性欄位差不多相同的類要進行一個互相的轉換,我們要把a物件的所有欄位的值都複製給b物件,我們只能用b.屬性=a.屬性來寫,如果屬性欄位太多的話,就要寫很多行復制語句,麻煩還容易漏掉一些,這個時候可以利用c#的反射來實現複製。我們可以寫這樣一個利用泛

java利用反射獲取某個包下的所有獲取物件屬性、方法、並例項化

首先貼上用到的jar包,當然也可以通過遞迴file.list獲取類的路徑名稱。 maven匯入jar包: <dependency> <groupId>

java利用反射呼叫類的某個方法

程式碼如下: 列印類Print.java package com.test.reflct; /** * 列印類 * * @date 2015-8-12 下午2:18:42 */ public class Print { public static

java 利用反射獲取內部類靜態成員變數的值

昨晚,一同事問到我,怎麼利用java反射解析內部類靜態成員變數的值,於是順手寫下了。 廢話不多說,直接上程式碼! 待解析類結構如下: /** * @Author changle * @Time

java利用反射獲取類資訊

在java.lang.reflect包中有三個類Field、Monthod和Constructor分別描述類的域、方法和構造器。還可以使用java.lang.reflect包中的Modifier類的靜態方法分析getModifiers返回的整型數值。例如可以使用ispubl

Java 物件之間相同屬性的賦值

參考文章 1.BeanUtils.copyProperties import org.springframework.beans.BeanUtils; User src = new User(); User dest = new User(); Bean

java利用反射動態呼叫方法,類似python的eval和exec函式

場景: 類C中存有方法A()和B(),String str存有方法的名字可能是A,也可能是B,要求能通過str的不同,呼叫相應名字的函式。 實現: 主要用到java反射機制,動態呼叫的方法:

java利用反射機制獲取實體類屬性自定義註解說明

最近做專案,需要利用java反射機制,獲取實體類自定義註解的說明資訊 1.自定義註解 <strong>package com.bjhy.platform.criminal.search.c

java 利用反射例項化類物件

package com.zhiru; /* * java 使用反射例項化一個類物件 * 第一種方式:建立類類物件,呼叫類類物件的newInatance方法獲取要例項化的類的物件,然後呼叫物件的s

java利用反射獲取物件類名以及物件屬性

原本想用來做搜尋的時候用,但是沒用上,所以還是貼出來。這個可以用在迴圈判斷物件的時候比較有用,程式碼如下:   rr=new ReceiveResume();   String a=rr.getClass().toString();   String b[]=a.spl

java 利用反射機制,獲取實體所有屬性和方法,並對屬性賦值

Field[] field = model.getClass().getDeclaredFields(); // 獲取實體類的所有屬性,返回Field陣列 try { for (int j = 0; j < field.length; j++)

安卓回撥函式解決同類之間函式呼叫和資料通訊的問題

歡迎轉載,請註明轉載自安卓訂閱號(安卓程式設計入門進階)。 安卓回撥函式的意義: 安卓中其實隨處可見回撥函式,使用者在手機上執行的大部分操作都會產生一個回撥事件,例如Button點選,listView的點選等。這些控制元件的回撥函式都已經在安卓系統中內建寫好,程式設計師使