Java使用反射获取字段属性

 更新时间:2023年06月16日 11:07:22   作者:按时交作业  
这篇文章主要为大家详细介绍了Java如何利用反射实现获取字段属性值,文中的示例代码讲解详细,具有很好的参考价值,希望对大家有所帮助

反射的使用

获得类的字段属性

下面是大Class提供的方法:

  • getField()只能获取public字段
  • getDeclaredField()可以获取所有字段,不考虑修饰符
  • getFields()获取所有public字段
  • getDeclaredFields()获取所有字段
public class Main {
    public static void main(String[] args) throws Exception {
        Class stdClass = Student.class;
        // 获取public字段"score":
        System.out.println(stdClass.getField("score"));
        // 获取继承的public字段"name":
        System.out.println(stdClass.getField("name"));
        // 获取private字段"grade":
        System.out.println(stdClass.getDeclaredField("grade"));
    }
}
class Student extends Person {
    public int score;
    private int grade;
}
class Person {
    public String name;
}

分析

输出:

public int Student.score
public java.lang.String Person.name
private int Student.grade

通过getField()方法可以获得类的属性,传入参数(需要被查找的属性名),获得的是一个Field对象。

然后该Field对象里又有很多方法。

一个Field对象包含了一个字段的所有信息:

  • getName():返回字段名称,例如,"name";
  • getType():返回字段类型,也是一个Class实例,例如,String.class;
  • getModifiers():返回字段的修饰符,它是一个int,不同的bit表示不同的含义。
  • getGenericType: 返回泛型的类型,比如: String.class
  • getAnnotation(): 返回注解对象,参数为要获得的注解的反射对象(Class),比如传入Data.class

当使用getModifiers():返回字段的修饰符的值,当想要进一步判断时,需要使用Modifier类。

可以使用Modifier类中的相应方法来判断:

  • Modifier.isPublic(int)
  • Modifier.isPrivate(int)
  • Modifier.isProtected(int)
  • Modifier.isStatic(int)
  • Modifier.isFinal(int)
Field score = stdClass.getField("score");
int modifiers = score.getModifiers();
System.out.println(Modifier.isFinal(modifiers));

·····

上面是获得类的属性信息,下面介绍获得实例的属性值。

获得实例的字段值

Field类还有一个方法get(),参数:要获得属性值的对象。

public class Main {
    public static void main(String[] args) throws Exception {
        Object p = new Person("Xiao Ming");
        Class c = p.getClass();
        Field f = c.getDeclaredField("name");
        f.setAccessible(true);
        Object value = f.get(p);
        System.out.println(value); // "Xiao Ming"
    }
}
class Person {
    private String name;
    public Person(String name) {
        this.name = name;
    }
}

分析

大家可能看到我新加了一行f.setAccessible(true);

去试试去掉会怎么样,大家应该会出现class thread.Main cannot access a member of class thread.Person with modifiers "private", 这种情况表明我们没有权限去访问该字段的值。

默认情况下,由于私有字段有私有访问权限修饰,所以即使通过反射获得 Field 对象,只能获得它的一些字段信息。但是无法读取其值,

  • 当调用 setAccessible(true) 后,此 Field 对象会取消 Java 访问修饰符的检查
  • 这就允许你调用 f.get() 方法来获取私有字段的值
  • 修改非public字段,需要首先调用setAccessible(true)

同理,获得属性值使用Field的get()方法,当为其设置值时可以使用set()方法,

参数为: 需要被设置属性的对象 传入的值。

比如: f.set(p, "guagua");

到此这篇关于Java使用反射获取字段属性的文章就介绍到这了,更多相关Java反射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中Date与String相互转换的方法

    Java中Date与String相互转换的方法

    这篇文章主要为大家详细介绍了Java中Date与String相互转换方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 详解JavaFX桌面应用开发-Group(容器组)

    详解JavaFX桌面应用开发-Group(容器组)

    这篇文章主要介绍了JavaFX桌面应用开发-Group(容器组),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • @RequestBody 部分属性没有转化成功的处理

    @RequestBody 部分属性没有转化成功的处理

    这篇文章主要介绍了@RequestBody 部分属性没有转化成功的处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 关于SpringBoot整合redis使用Lettuce客户端超时问题

    关于SpringBoot整合redis使用Lettuce客户端超时问题

    使用到Lettuce连接redis,一段时间后不操作,再去操作redis,会报连接超时错误,在其重连后又可使用,纠结是什么原因导致的呢,下面小编给大家带来了SpringBoot整合redis使用Lettuce客户端超时问题及解决方案,一起看看吧
    2021-08-08
  • 基于StringUtils工具类的常用方法介绍(必看篇)

    基于StringUtils工具类的常用方法介绍(必看篇)

    下面小编就为大家带来一篇基于StringUtils工具类的常用方法介绍(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • SpringBoot项目打包发布到外部tomcat(出现各种异常的解决)

    SpringBoot项目打包发布到外部tomcat(出现各种异常的解决)

    这篇文章主要介绍了SpringBoot项目打包发布到外部tomcat(出现各种异常的解决),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Java连接FTP服务器并使用ftp连接池进行文件操作指南

    Java连接FTP服务器并使用ftp连接池进行文件操作指南

    使用FTP最主要的功能是对文件进行管理,下面这篇文章主要给大家介绍了关于Java连接FTP服务器并使用ftp连接池进行文件操作的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • Java数据结构之LinkedList的用法详解

    Java数据结构之LinkedList的用法详解

    链表(Linked list)是一种常见的基础数据结构,是一种线性表。Java的LinkedList(链表) 类似于 ArrayList,是一种常用的数据容器,本文就来简单讲讲它的使用吧
    2023-05-05
  • 一篇超详细的Spring Boot对jdbc支持的文章

    一篇超详细的Spring Boot对jdbc支持的文章

    JdbcTemplate 是在JDBC API基础上提供了更抽象的封装,并提供了基于方法注解的事务管理能力。 通过使用SpringBoot自动配置功能并代替我们自动配置beans,下面给大家介绍spring boot中使用JdbcTemplate相关知识,一起看看吧
    2021-07-07
  • springboot读取自定义配置文件时出现乱码解决方案

    springboot读取自定义配置文件时出现乱码解决方案

    这篇文章主要介绍了springboot读取自定义配置文件时出现乱码解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论