【Java反射】getDeclaredField(String name) 和 getField(String name)区别

2024-06-23 18:28

本文主要是介绍【Java反射】getDeclaredField(String name) 和 getField(String name)区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

getDeclaredField(String name)getField(String name) 都是Java反射API中用于获取类字段(成员变量)的方法,但它们之间存在一些关键的区别:

getDeclaredField(String name)

  • 功能:这个方法返回的是声明在该类中的指定名称的字段,包括私有、受保护、默认(包访问权限)和公有字段,不论该字段是在哪个类中声明的。也就是说,它会查找该类声明的所有字段,包括那些从超类继承来的字段(但注意,它返回的是当前类中声明的同名字段,而不是超类的字段)。
  • 访问权限:即使字段是私有的,通过调用setAccessible(true),也能访问到这个字段。
  • 异常:如果找不到指定名称的字段,会抛出NoSuchFieldException

getField(String name)

  • 功能:这个方法返回的是公共(public)的字段,并且这个字段必须是在当前类或其父类中声明的(直接可访问的,不包括私有字段)。它只查找公共字段,不会查找私有、受保护或默认访问级别的字段。
  • 访问权限:由于它只能获取公共字段,所以不需要特别设置访问权限。
  • 异常:如果找不到指定名称的公共字段,同样会抛出NoSuchFieldException

区别总结

  • 访问范围getDeclaredField能够访问到类中声明的所有字段(包括私有的),而getField仅能访问公共字段。
  • 继承性getField会查找当前类及其父类中声明的公共字段,而getDeclaredField虽然也能看到父类字段(但返回的是当前类中声明的同名字段,如果有),但它主要关注的是当前类的声明。
  • 使用场景:如果你需要访问包括私有字段在内的所有字段,应该使用getDeclaredField。如果你只需要访问和操作公共字段,使用getField更合适。

在实际应用中,根据需要访问的字段的可见性和位置(是否在当前类中直接声明),你会选择使用其中之一。

这篇关于【Java反射】getDeclaredField(String name) 和 getField(String name)区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087927

相关文章

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

在Dockerfile中copy和add的区别及说明

《在Dockerfile中copy和add的区别及说明》COPY和ADD都是Dockerfile中用于文件复制的命令,但COPY仅用于本地文件或目录的复制,不支持自动解压缩;而ADD除了复制本地文件或... 目录在dockerfile中,copy 和 add有什么区别?COPY 命令ADD 命令总结在Doc

Spring Cloud Hystrix原理与注意事项小结

《SpringCloudHystrix原理与注意事项小结》本文介绍了Hystrix的基本概念、工作原理以及其在实际开发中的应用方式,通过对Hystrix的深入学习,开发者可以在分布式系统中实现精细... 目录一、Spring Cloud Hystrix概述和设计目标(一)Spring Cloud Hystr

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

springMVC返回Http响应的实现

《springMVC返回Http响应的实现》本文主要介绍了在SpringBoot中使用@Controller、@ResponseBody和@RestController注解进行HTTP响应返回的方法,... 目录一、返回页面二、@Controller和@ResponseBody与RestController

JAVA集成本地部署的DeepSeek的图文教程

《JAVA集成本地部署的DeepSeek的图文教程》本文主要介绍了JAVA集成本地部署的DeepSeek的图文教程,包含配置环境变量及下载DeepSeek-R1模型并启动,具有一定的参考价值,感兴趣的... 目录一、下载部署DeepSeek1.下载ollama2.下载DeepSeek-R1模型并启动 二、J

springboot rocketmq配置生产者和消息者的步骤

《springbootrocketmq配置生产者和消息者的步骤》本文介绍了如何在SpringBoot中集成RocketMQ,包括添加依赖、配置application.yml、创建生产者和消费者,并展... 目录1. 添加依赖2. 配置application.yml3. 创建生产者4. 创建消费者5. 使用在

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解