# 第四章第一节--反射访问数据
标签(空格分隔): 廖雪峰
---
## field
通过Class实例获取field信息:
- getField(name):获取某个public的field(包括父类).
- getDeclaredField(name):获取当前类的某个field(不限定public不包括父类).
- getFields():所以public的field(包含父类).
- getDeclaredFields(name):获取当前类的所有field(不限定public不包含父类).
一个Field对象包含一个field的所有信息:
- getName():获得名称.
- getType():属性定一个类型.
- getModifiers():获得属性定义的修饰符(public/private/等).
![通过field对象获取属性的信息](http://p0b921qfc.bkt.clouddn.com/18-5-18/91314040.jpg)
通过Field对象或得field的值:
- 获取field的值
通过get(Object获取一个实例的该字段.制作演示,Integer中的value是private,无法直接获取.)
![通过get得到field的值](http://p0b921qfc.bkt.clouddn.com/18-5-18/56268098.jpg)
- 设置field的值.
通过set(Object,Object)设置一个实例中该字段的值.
![通过set修改field的值](http://p0b921qfc.bkt.clouddn.com/18-5-18/14507303.jpg)
注意:
1. 当field的限制符为private的时候,不能通过field.get(Object)和field.set(Object,Object)来操作这个字符,这是需要在前面加上field.setAccessible(true)来强制访问.
2. 操作非静态字段的时候通过field.get(Object)获取,而静态字段不需要实例化对象所以采用field.get(null)即可.field.set(Object,Object)也变为field.set(null,Object).
3. setAccessible(true)可能会失败,应为java定义了SecurityManager,SecurityManager的规则可以阻止对该Field设置accessible,例如该规则应用于所有java和javax开头的package(java核心类).
## 小节小结.
- Field对象封装了字段的所有信息.
- 通过Class实例方法可以获得Field实例:getField/getFields/getDeclaredField/getDeclaredFields.
- 通过Field实例可以获取字段的信息:getName/getType/getModifiers
- 通过Field实例可以读取或者设置某个对象的字段:get(Object instance)/set(Object instance,Object fieldValue)
- 通过设置setAccessible(true)来访问非public字段(除了java核心类).
- 前言
- 一:Java快速入门
- 二:Java面向对象编程
- 三:Java异常处理
- 错误处理
- Java的异常
- 捕获异常
- 抛出异常
- 自定义异常
- 断言和日志
- 使用断言
- 使用JDK Logging
- 使用Commons Logging
- 使用Log4j
- 四:Java反射与泛型
- 反射
- Class类
- 访问字段
- 调用方法
- 调用构造方法
- 获取继承关系
- 注解
- 使用注解
- 定义注解
- 处理注解
- 泛型
- 什么是泛型
- 使用泛型
- 编写泛型
- 擦拭法
- extends通配符
- super通配符
- 泛型和反射
- 五:Java集合
- Java集合简介
- Java集合简介
- List
- 使用List
- 编写equals方法
- Map
- Set
- Queue
- Stack
- 最佳实践
- 六:Java IO编程
- 七:Java处理日期和时间
- 八:JUnit单元测试
- 九:Java正则表达式
- 十:Java加密与安全
- 十一:Java多线程编程
- 十二:Maven基础
- 十三:Java网络编程
- 十四:Java操作XML和JSON
- 十五:Java JDBC编程
- 十六:Java函数式编程