概述
案例: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反射机制详解
转载于:https://www.cnblogs.com/whcwkw1314/p/8654250.html
最后
以上就是眼睛大过客为你收集整理的JAVA反射之私有属性赋值总结反射案例用到的方法:的全部内容,希望文章能够帮你解决JAVA反射之私有属性赋值总结反射案例用到的方法:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复