首页 > 编程语言 >34-Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别

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

时间:2024-04-18 11:45:25浏览次数:29  
标签:Java String name 34 field getDeclaredFields public 属性

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

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

相关文章

  • java 打的jar 变小
    第1步:将第三方Jar单独存放,使用下面的命令,把依赖的包放到D:\temp\lib:mvndependency:copy-dependencies-DoutputDirectory=E:\temp\lib-DincludeScope=runtime注意:在idea里面配置一定要取消 mvn,不然会报错,idea会自动加上mvn   第2步:单独打包我们自己写的代码,修改......
  • java桥接模式案例
    桥接模式(BridgePattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立变化。在桥接模式中,抽象类和它的实现类之间使用组合/聚合关系,而不是继承关系。这样,客户端代码可以针对抽象编程,而实现细节则可以在运行时动态地指定。场景:假设我们要设计一个图形绘制系统......
  • java play框架get Start
    背景:一个老板找到我,他有一个项目是用play框架写的,我从来没有听说java还有一个play框架。回来以后我去网上查了一下,play框架是一个轻量级的全栈开发框架,完全背离了传统servlet的风格。play框架在国内使用并不多,使用简单易上手,开发大型项目也能胜任,这样的项目原来设计者设计完......
  • java使用Workbook workbook = new XSSFWorkbook(inputStream);导出数据频繁GC
    由于xlsx底层使用xml存储,占用内存会比较大,官方也意识到这个问题,在3.8版本之后,提供了SXSSFWorkbook来优化写性能原来代码Workbookworkbook= newXSSFWorkbook(inputStream);优化后代码Workbookworkbook= newSXSSFWorkbook(newXSSFWorkbook(inputStream));此处有坑,请往......
  • java代码审计跨站脚本(XSS)--反射型
    一、基础:跨站脚本(Xss)一、原理:恶意攻击者往web页面里插入恶意js代码,而在服务端没有对数据进行严格的过滤。当用户浏览页面时,js代码必须在该html页面中(hrml必须要存在这个而已艾玛),从而达到攻击用户的目的。(攻击者构造的的js代码会被当作正常的HTML、JS代码被解析,执行Js脚本实现攻......
  • 当 mysql-connector-java-5 遇上 MySQL8,终究还是错付了 → 门当户对真的很重要!
    开心一刻今天,老婆给我发消息老婆:老公,儿子从隔壁邻居家回来了老婆:是先打还是先洗?我:先洗吧,万一打错人了呢老婆:先洗脸吧,没错就边打边洗起因在我们的固有认知中, mysql-connector-java-5.x.x 连接的是 MySQL5 ,而 mysql-connector-java-8.x.x 连......
  • ABC349
    不用考试了/kx/kx/kx/kx/kx/kx/kxABCD一眼。E发现状态不多,可以直接搜,状态之间的转移关系很容易让人想到minimax搜索,直接做即可。注意细节。F题面没有废话,数据范围良心,做法巧妙,好评。link一看到lcm,不难想到要分解质因数,试除法可以通过,不过我们更喜欢Pollard-Rho。将\(......
  • Java并发(二十五)----异步模式之生产者/消费者
    1.定义要点与Java并发(二十二)----同步模式之保护性暂停中的保护性暂停中的GuardObject不同,不需要产生结果和消费结果的线程一一对应这样的好处是消费队列可以用来平衡生产和消费的线程资源生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据......
  • P10342 [THUSC 2019] 数列 题解
    形式化题面:求\[\sum_{l=1}^{n}\sum_{r=l}^{n}\max_{i=l}^{r}(i-l+1)\timesf(i,r)\]其中\(f(l,r)\)为\(a_l,...,a_r\)中有多少个不同的数字。注意到,除了Sub2,其余数据点都有\(\maxf\le800\),这启发我们考虑\(O(nm)\)的算法。套路地,扫描线枚举右端点,则现在只需要考虑......
  • JavaScript初了解
    最近想写一个web应用,打算稍微学一下。本文是个人在学习过程中的笔记,目的是分享。本文的阅读对象是已经有一门编程语言的基础,想进一步大致了解JS语言的读者本文章不适合完全零基础且对前端毫无概念的伙伴。1、变量和数据类型//number数值型varmyNum=10//字符型varmyStr......