需求:在开发过程中,经常会遇到的一个问题是,需要判断某个字符串是不是对象的某个成员属性名,然后根据判断结果去操作这个成员属性
参考教程:Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别_java declaredfields-CSDN博客
可以通过以下方法:
getFields(): 获取某个类的所有的public字段,其中是包括父类的public字段的
getDeclaredFields():获取某个类的自身的所有字段,不包括父类的字段
我们创建一个父类:Person , 其中name属性特意声明成了public类型,age属性声明为private
package org.itheima; public class Person { public String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person(String name, int age) { this.name = name; this.age = age; } }
创建子类:Student,其中school属性声明为public,speciality属性声明为private
package org.itheima; public class Student extends Person{ public String school; private String speciality; public String getSpeciality() { return speciality; } public void setSpeciality(String speciality) { this.speciality = speciality; } public String getSchool() { return school; } public void setSchool(String school) { this.school = school; } public Student(String name, int age, String school, String speciality) { super(name, age); this.school = school; this.speciality = speciality; } }
案例:getFields()与getDeclaredFields()方法的区别
package org.itheima; import java.lang.reflect.Field; public class HelloWorld { public static void main(String[] args) throws IllegalAccessException{ Student stu = new Student("马铃薯", 26, "清华大学","计算机科学与技术"); // getDeclaredFields():获取某个类的自身的所有字段,不包括父类的字段 Field[] field2 = stu.getClass().getDeclaredFields(); System.out.println("==============getDeclaredFields()方法获取的属性=============="); for (Field field : field2) { // 对于私有的成员变量来说,要操作其属性值的话,就需要设置setAccessible(true); // field.setAccessible(true)就是让我们在反射时,可以操作私有成员属性的值 field.setAccessible(true); System.out.println("成员属性修饰符: "+field.getModifiers()+" 成员属性:"+field.getName()+" 成员属性值: "+field.get(stu)); } // getFields(): 获取某个类的所有的public字段,其中是包括父类的public字段的 Field[] field1 = stu.getClass().getFields(); System.out.println("==============getFields()方法获取的属性=============="); for (Field field : field1) { System.out.println("成员属性修饰符: "+field.getModifiers()+" 成员属性:"+field.getName()+" 成员属性值: "+field.get(stu)); } } }
上面的成员属性修饰符返回的是int型变量,1代表的就是public,2代表的就是private,具体的对照关系可以参看java.lang.reflect.Modifier 这个类
扩展:修改了字段的访问控制权限毕竟是不安全的,所以在操作结束后有必要修改回原来的访问控制权限
package org.itheima; import java.lang.reflect.Field; public class HelloWorld { public static void main(String[] args) throws IllegalAccessException{ Student stu = new Student("马铃薯", 26, "清华大学","计算机科学与技术"); // getDeclaredFields():获取某个类的自身的所有字段,不包括父类的字段 Field[] field2 = stu.getClass().getDeclaredFields(); System.out.println("==============getDeclaredFields()方法获取的属性=============="); for (Field field : field2) { // 对于私有的成员变量来说,要操作其属性值的话,就需要设置setAccessible(true); // field.setAccessible(true)就是让我们在反射时,可以操作私有成员属性的值 boolean flag = field.isAccessible(); if(!field.isAccessible()){ field.setAccessible(true); } System.out.println("成员属性修饰符: "+field.getModifiers()+" 成员属性:"+field.getName()+" 成员属性值: "+field.get(stu)); field.setAccessible(flag); } } }
标签:Java,String,name,34,field,getDeclaredFields,public,属性 From: https://www.cnblogs.com/REN-Murphy/p/18143161