多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 第四章第一节--反射访问数据 标签(空格分隔): 廖雪峰 --- ## 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核心类).