java反射的實際應用


java反射覆蓋

    功能:用於某個對象的新舊值進行更新覆蓋操作。用途:常用於電商系統訂單以及商品的新舊更新。

具體代碼:下面以學生實體類進行講解。

/**
 * 學生類
 */
public class Student {
    private Integer sid;
    private String sname;
    private Integer age;
    private String gender;

    public Student(int sid, String sname, int age, String gender) {
        this.sid = sid;
        this.sname = sname;
        this.age = age;
        this.gender = gender;
    }



    public Student(String sname, Integer age, String gender) {
        this.sname = sname;
        this.age = age;
        this.gender = gender;
    }

    public Student() {
    }

    public Integer getSid() {
        return sid;
    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }



    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

 

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;

/**
 * 反射工具類
 */
public class ReflectUtils {

    /**
     * 反射覆蓋
     *
     */
    public static void saveOrupdate(Object s1,Object s2) throws  Exception{
        Class<?> c1=s1.getClass();
        Class<?> c2=s2.getClass();
        Field[] fields=c1.getDeclaredFields();
        for(Field field:fields) {
            field.setAccessible(true);
            String name = field.getName(); // 獲取屬性的名字
            name = name.substring(0, 1).toUpperCase() + name.substring(1); // 將屬性的首字符大寫,方便構造get,set方法
            String type = field.getGenericType().toString(); // 獲取屬性的類型
            if (type.equals("class java.lang.String")) { // 如果type是類類型,則前面包含"class ",后面跟類名
                Method m = c2.getMethod("get" + name);
                String value = (String) m.invoke(s2); // 調用getter方法獲取屬性值
                field.set(s1,value);
            }
            if (type.equals("class java.lang.Integer")) {
                Method m = c2.getMethod("get" + name);
                Integer value = (Integer) m.invoke(s2);
                field.set(s1,value);
            }

            if (type.equals("class java.lang.Boolean")) {
                Method m = c2.getMethod("get" + name);
                Boolean value = (Boolean) m.invoke(s2);
                field.set(s1,value);
            }
            if (type.equals("class java.util.Date")) {
                Method m = c2.getMethod("get" + name);
                Date value = (Date) m.invoke(s2);
                field.set(s1,value);
            }
        }

    }

    public static void main(String[] args) {
        Student s1=new Student(1,"張三",24,"男");
        Student s2=new Student("趙薇",38,"女");
        try {
            saveOrupdate(s1,s2);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(s1.toString());

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM