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()); } }