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

腾讯面经:Java 如何获取私有对象(成员变量)?一文搞懂反射访问 private!
在 Java 开发中我们经常会把成员变量定义成privateclassUser{privateStringnameTom;}这时候很多初学者都会有疑问private不是只能类内部访问吗在类外面还能获取吗为什么 Spring、MyBatis 等框架还能读取私有属性答案就是Java 反射Reflection。一、什么是 privateprivate是 Java 的访问修饰符表示只能在当前类内部访问。例如classUser{privateStringnameTom;}下面这样访问会直接报错UserusernewUser();System.out.println(user.name);编译器提示name has private access in User这是因为private限制了外部直接访问。二、如何获取 private 成员Java 提供了反射机制。例如importjava.lang.reflect.Field;classUser{privateStringnameTom;}publicclassTest{publicstaticvoidmain(String[]args)throwsException{UserusernewUser();FieldfieldUser.class.getDeclaredField(name);field.setAccessible(true);Stringvalue(String)field.get(user);System.out.println(value);}}运行结果Tom即使name是private依然可以读取。三、为什么可以访问 private关键就在这一句field.setAccessible(true);它的作用是关闭 Java 的访问权限检查。正常情况下private ↓ 不能访问调用setAccessible(true)之后private ↓ 关闭权限检查 ↓ 可以访问因此就能够读取甚至修改私有成员。四、还能修改 private 成员吗当然可以。例如FieldfieldUser.class.getDeclaredField(name);field.setAccessible(true);field.set(user,Jack);System.out.println(field.get(user));输出Jack说明不仅可以读取还可以修改私有属性。五、为什么框架都能访问 private很多人第一次接触 Spring 都会疑惑AutowiredprivateUserServiceuserService;既然是privateSpring 为什么还能赋值原因就是Spring 底层也是通过反射完成的。流程大致如下扫描 Bean ↓ 找到 private 字段 ↓ setAccessible(true) ↓ field.set(...) ↓ 完成依赖注入MyBatis、Hibernate、Jackson 等框架也大量使用了这种方式。六、getField() 和 getDeclaredField() 有什么区别这是面试中的高频追问。例如FieldfieldUser.class.getField(name);如果name是private会直接报错。因为getField()只能获取 public 成员变量。而FieldfieldUser.class.getDeclaredField(name);可以获取privateprotected默认packagepublic所有成员变量。因此访问私有字段时一般使用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 等框架底层常用的实现方式。