案例:Map集合若有key(鍵)與User類中的私有屬性相同,就把對應的value值賦值給該私有屬性。

public class User { private int id; private String name; private String sex; private String address; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } }
測試類:
public class Test { Map<String,Object> map = new HashMap<String,Object>(); @org.junit.Test public void test() throws ClassNotFoundException, IllegalAccessException, InstantiationException { map.put("name","whc"); map.put("sex","男"); Class<?> classu = Class.forName("reflect.User"); //得到user類的全部屬性(修飾符+類型+名字) Field[] userFields = classu.getDeclaredFields(); User user = new User(); for (int i = 0; i <userFields.length ; i++) { // AccessibleTest類中的成員變量為private,故必須進行此操作 // 取消屬性的訪問權限控制,即使private屬性也可以進行訪問。 userFields[i].setAccessible(true); //遍歷keyset for (String s : map.keySet()) { ////如果有屬性名和key相同 if (userFields[i].getName().equals(s)){ // 將指定對象變量上(user) 此Field對象表示的字段設置為指定的新值。 userFields[i].set(user,map.get(s)); } } } System.out.println(user); } @org.junit.Test public void test2() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { map.put("name","whc"); map.put("sex","男"); Class<?> classu = Class.forName("reflect.User"); //得到user類的全部屬性(修飾符+類型+名字) Field[] userFields = classu.getDeclaredFields(); User user = (User) classu.newInstance(); for (int i = 0; i <userFields.length ; i++) {//遍歷keyset for (String s : map.keySet()) { //如果有屬性名和key相同 if (userFields[i].getName().equals(s)){ //調用user類中的set方法 注意set方法后面字母大寫 Method method = classu.getMethod("set" + s.substring(0, 1).toUpperCase() + s.substring(1), String.class); method.invoke(user,map.get(s)); } } } System.out.println(user); } }
第一種:直接在指定對象(user) 將Field對象表示的字段設置為指定的新值。注意:取消屬性的訪問權限控制
第二種:通過得到User類中的set方法給私有屬性賦值
結果:
總結反射案例用到的方法:
1.實例化Class類對象
Class<?> classu = Class.forName("reflect.User");
2.獲得某個類的全部屬性
Field[] userFields = classu.getDeclaredFields();
3.取消權限的訪問控制
userFields[i].setAccessible(true);
4.得到屬性的字段名
userFields[i].getName()
5.將指定對象變量上(user) 此Field對象表示的字段設置為指定的新值。
userFields[i].set(user,map.get(s));
6.通過反射實例化類的對象
User user = (User) classu.newInstance();
7.通過反射機制調用某個類的方法
Method method = classu.getMethod();//參數:方法名 若方法有參數,加上參數類型的class對象
method.invoke();//參數:實例化出來的類對象,若方法有參數,加上值value
參考:JAVA反射機制詳解