案例:Map集合若有key(键)与User类中的私有属性相同,就把对应的value值赋值给该私有属性。
User类:
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 + '\'' +
'}';
}
}
User类
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