34-Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别

需求:在开发过程中,经常会遇到的一个问题是,需要判断某个字符串是不是对象的某个成员属性名,然后根据判断结果去操作这个成员属性

参考教程: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);
        }  

    }
}

 

posted @ 2024-04-18 11:37  马铃薯1  阅读(62)  评论(0编辑  收藏  举报