news 2026/7/16 23:41:00

腾讯面经:Java 如何获取私有对象(成员变量)?一文搞懂反射访问 private!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
腾讯面经:Java 如何获取私有对象(成员变量)?一文搞懂反射访问 private!

在 Java 开发中,我们经常会把成员变量定义成private

classUser{privateStringname="Tom";}

这时候很多初学者都会有疑问:

  • private不是只能类内部访问吗?
  • 在类外面还能获取吗?
  • 为什么 Spring、MyBatis 等框架还能读取私有属性?

答案就是:Java 反射(Reflection)


一、什么是 private?

private是 Java 的访问修饰符,表示只能在当前类内部访问

例如:

classUser{privateStringname="Tom";}

下面这样访问会直接报错:

Useruser=newUser();System.out.println(user.name);

编译器提示:

name has private access in User

这是因为private限制了外部直接访问。


二、如何获取 private 成员?

Java 提供了反射机制

例如:

importjava.lang.reflect.Field;classUser{privateStringname="Tom";}publicclassTest{publicstaticvoidmain(String[]args)throwsException{Useruser=newUser();Fieldfield=User.class.getDeclaredField("name");field.setAccessible(true);Stringvalue=(String)field.get(user);System.out.println(value);}}

运行结果:

Tom

即使nameprivate,依然可以读取。


三、为什么可以访问 private?

关键就在这一句:

field.setAccessible(true);

它的作用是:

关闭 Java 的访问权限检查。

正常情况下:

private ↓ 不能访问

调用:

setAccessible(true)

之后:

private ↓ 关闭权限检查 ↓ 可以访问

因此,就能够读取甚至修改私有成员。


四、还能修改 private 成员吗?

当然可以。

例如:

Fieldfield=User.class.getDeclaredField("name");field.setAccessible(true);field.set(user,"Jack");System.out.println(field.get(user));

输出:

Jack

说明不仅可以读取,还可以修改私有属性。


五、为什么框架都能访问 private?

很多人第一次接触 Spring 都会疑惑:

@AutowiredprivateUserServiceuserService;

既然是private,Spring 为什么还能赋值?

原因就是:

Spring 底层也是通过反射完成的。

流程大致如下:

扫描 Bean ↓ 找到 private 字段 ↓ setAccessible(true) ↓ field.set(...) ↓ 完成依赖注入

MyBatis、Hibernate、Jackson 等框架也大量使用了这种方式。


六、getField() 和 getDeclaredField() 有什么区别?

这是面试中的高频追问。

例如:

Fieldfield=User.class.getField("name");

如果nameprivate,会直接报错。

因为:

getField()只能获取 public 成员变量。

而:

Fieldfield=User.class.getDeclaredField("name");

可以获取:

  • private
  • protected
  • 默认(package)
  • public

所有成员变量。

因此:

访问私有字段时,一般使用getDeclaredField()


七、面试如何回答?

如果面试官问:

Java 如何获取 private 成员变量?

可以这样回答:

Java 可以通过反射获取私有成员变量。首先使用getDeclaredField()获取字段对象,再调用setAccessible(true)关闭 Java 的访问权限检查,最后通过field.get()获取值,或使用field.set()修改值。Spring、MyBatis 等框架底层也大量使用这种反射机制来访问和注入私有成员。


八、总结

记住下面四句话即可:

  • private成员默认只能在类内部访问。
  • 反射可以突破访问限制,访问 private 成员。
  • 访问私有字段通常使用getDeclaredField()
  • 调用setAccessible(true)后,就可以读取或修改私有成员。

一句话总结:Java 获取私有成员的核心就是反射,通过getDeclaredField()获取字段,再调用setAccessible(true)关闭访问检查,从而读取或修改private成员,这也是 Spring、MyBatis 等框架底层常用的实现方式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 23:39:10

C++ Builder XE10演示项目:从RAD开发到多线程实战全解析

1. 项目概述:为什么需要一个“演示项目”?如果你是一位刚从Visual Studio或者Qt Creator转战到C Builder XE10的开发者,或者你是一位想快速评估这个IDE是否适合团队新项目的技术负责人,那么你很可能和我当初一样,面对一…

作者头像 李华
网站建设 2026/7/16 23:38:55

终极选择指南:tiny11builder两大脚本如何选?功能差异一目了然

终极选择指南:tiny11builder两大脚本如何选?功能差异一目了然 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 想要为老旧电脑或虚拟机打造…

作者头像 李华
网站建设 2026/7/16 23:37:12

Quartus Prime IP核授权破解:从特征码识别到License文件定制

1. Quartus Prime IP核授权机制解析在FPGA开发领域,IP核就像是现成的乐高积木块,能让我们快速搭建复杂系统。Altera(现Intel PSG)提供的IP核分为两大类:基础功能IP和高级功能IP。基础IP包括PLL、存储器控制器这些"…

作者头像 李华
网站建设 2026/7/16 23:35:58

AI技术前沿动态简报(2026.07.13)

本简报由自动化任务每日定时生成,聚焦 AI 技术突破、大模型创新、AI Agent、生成式 AI 与多模态 AI 五个方向,内容基于公开论文、官方技术博客与权威媒体报道整理。 第1条:Anthropic 发布 J-lens 技术,观察到 Claude Opus 4.6 内部…

作者头像 李华
网站建设 2026/7/16 23:34:16

MonoGame 3D游戏开发:5个关键步骤实现专业级模型与动画系统

MonoGame 3D游戏开发:5个关键步骤实现专业级模型与动画系统 【免费下载链接】MonoGame One framework for creating powerful cross-platform games. 项目地址: https://gitcode.com/gh_mirrors/mo/MonoGame 想要在跨平台游戏开发中构建令人惊艳的3D体验&…

作者头像 李华
网站建设 2026/7/16 23:33:24

CANN/asc-devkit GEMV矩阵向量乘特性说明

# GEMV 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://git…

作者头像 李华