1 public classDemo12{2

3 /*

4 对任意一个Object实例,只要我们获取了它的Class,就可以获取它的一切信息5 Class类提供了以下几个方法来获取字段6

7 Field getField(name):根据字段名获取某个public的field(包括父类)8 Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)9 Field getFields():获取全部public的field(包括父类)10 Field getDeclaredField():获取当前类的全部field(不包括父类)11 */

12

13 //reflection反射

14 public static void main(String[] args) throws Exception{ //记住要抛出异常

15 Class stuClass = Student.class;16 //获取public字段"score"

17 System.out.println(stuClass.getField("score"));//public int Student.score18 //获取继承的public字段"name"

19 System.out.println(stuClass.getField("name"));//public java.lang.String Person.name20 //获取private字段"grade"

21 System.out.println(stuClass.getDeclaredField("grade"));22 }23 }24

25 class Student extendsPerson{26 public intscore;27 //班级字段私有

28 private intgrade;29 }30

31 classPerson{32 publicString name;33 }

一个Field对象包含了一个字段的所有信息

getName():返回字段名称,例如"name"

getType():返回字段类型,也是一个Class实例,例如,String.class

getModifiers():返回字段的修饰符,它是一个int,不同的bit表示不同的含义

1 public static void main(String[] args) throws Exception{ //记住要抛出异常

2 Class stuClass = Student.class;3 //获取public字段"score"

4 Field f = stuClass.getField("score");5 //获取字段名称

6 System.out.println(f.getName());//score7 //获取字段类型

8 System.out.println(f.getType());9 //获取字段的修饰符所代表的bit数字

10 int m =f.getModifiers();11 System.out.println(m);12 //判断字段是哪种修饰符

13 System.out.println(Modifier.isFinal(m));14 System.out.println(Modifier.isPublic(m));15 System.out.println(Modifier.isProtected(m));16 System.out.println(Modifier.isPrivate(m));17 System.out.println(Modifier.isStatic(m));18 }

获取字段值

利用反射拿到字段的一个Field实例只是第一步,我们还可以拿到一个实例对应的该字段的值。

例如,对于一个Person实例,我们可以先拿到name字段对应的Field,再获取这个实例的name字段的值:

1 import java.lang.reflect.*;2 public classDemo12{3 //reflection反射

4 public static void main(String[] args) throws Exception{ //记住要抛出异常

5 Object p = new Person("先把SE学完!");6 Class cls =p.getClass();7 Field f = cls.getDeclaredField("name");8 //因为name被定义为一个private字段,正常情况下,Main类无法访问Person类的private字段,会得到一个IllegalAccessException9 //调用Field.setAccessible(true)的意思是,别管这个字段是不是public,一律允许访问

10 f.setAccessible(true);11

12 //用Field.get(Object)获取指定实例的指定字段的值

13 Object value =f.get(p);14 System.out.println(value);//先把SE学完!

15 }16 }17

18 classPerson {19 privateString name;20

21 publicPerson(String name) {22 this.name =name;23 }24 }

有童鞋会问:如果使用反射可以获取private字段的值,那么类的封装还有什么意义?

答案是正常情况下,我们总是通过p.name来访问Person的name字段,编译器会根据public、protected和private决定是否允许访问字段,这样就达到了数据封装的目的。

而反射是一种非常规的用法,使用反射,首先代码非常繁琐,其次,它更多地是给工具或者底层框架来使用,目的是在不知道目标实例任何信息的情况下,获取特定字段的值。

此外,setAccessible(true)可能会失败。如果JVM运行期存在SecurityManager,那么它会根据规则进行检查,有可能阻止setAccessible(true)。例如,某个SecurityManager可能不允许对java和javax开头的package的类调用setAccessible(true),这样可以保证JVM核心库的安全。

设置字段值

通过Field实例既然可以获取到指定实例的字段值,自然也可以设置字段的值。

设置字段值是通过Field.set(Object, Object)实现的,其中第一个Object参数是指定的实例,第二个Object参数是待修改的值。示例代码如下:

1 import java.lang.reflect.*;2 public classDemo12{3 //reflection反射

4 public static void main(String[] args) throws Exception{ //记住要抛出异常5 //创建Person对象

6 Object p = new Person("正在学反射");7 //获取Person对象的Class对象

8 Class cls =p.getClass();9 //获取Class对象的字段对象

10 Field f = cls.getDeclaredField("name");11 //因为字段是private,所以必须设置访问权限为true,才可以进行访问

12 f.setAccessible(true);13 //访问字段值

14 Object value =f.get(p);15 System.out.println(value);16 //修改字段值

17 f.set(p,"坚持学下去!");18 //再次访问字段值

19 value =f.get(p);20 System.out.println(value);21 }22 }23

24 classPerson {25 privateString name;26

27 publicPerson(String name) {28 this.name =name;29 }30 }

小结

Java的反射API提供的Field类封装了字段的所有信息:

通过Class实例的方法可以获取Field实例:getField(),getFields(),getDeclaredField(),getDeclaredFields();

通过Field实例可以获取字段信息:getName(),getType(),getModifiers();

通过Field实例可以读取或设置某个对象的字段,如果存在访问限制,要首先调用setAccessible(true)来访问非public字段。

通过反射读写字段是一种非常规方法,它会破坏对象的封装。

java反射获取字段的顺序6_反射之获取字段相关推荐

  1. mysql修改字段的顺序_Mysql中如何修改字段的排列顺序?

    创建数据表的数据,字段在表中的位置已经确定了.但要修改字段在表中的排列位置,则需要使用ALTER TABLE语句来处理.在MySQL中,修改字段排列位置的基本语法格式如下: ALTER TABLE M ...

  2. 根据excel列动态创建mysql表_根据数据库字段动态生成excel模版下载,上传模版获取数据存入数据库(poi 反射)...

    环境:mysql5.7.28 java8 Spring boot 2.2.4 mybatis-plus3.10 动态:根据需求,用户可以选择对应的字段生成excle模版 下载 poi 反射:poi是e ...

  3. Java 编程问题:七、Java 反射类、接口、构造器、方法和字段

    原文:Java Coding Problems 协议:CC BY-NC-SA 4.0 贡献者:飞龙 本文来自[ApacheCN Java 译文集],自豪地采用谷歌翻译. 本章包括涉及 Java 反射 ...

  4. Java筑基——反射(1):基本类周边信息获取

    相关文章: Java筑基--反射(1):基本类周边信息获取: Java筑基--反射(2):泛型周边信息获取: Java筑基--反射(3):类内部信息获取 目录 1. 前言 2. 正文 2.1 类的生命 ...

  5. java 反射 父类的属性_用反射的方式获取父类中的所有属性和方法

    package com.syh.jdbc.reflection_super; /** * 父类 * @author syh * */ public class Parent { public Stri ...

  6. java反射 获取方法参数名_java 反射借助 asm 获取参数名称最优雅简单的方式

    背景说明 最近写反射相关的代码,想获取对应的参数名称,却发现没有特别好的方式. jdk7 及其以前,是无法通过反射获取参数名称的. jdk8 可以获取,但是要求指定 -parameter 启动参数,限 ...

  7. java 反射获取修饰符_java之反射和BeanUtils类

    反射和BeanUtils类 1. 类的初始化:类什么什么情况下会加载到内存中 只要类加载到内存中,那么类加载器就会为这个类创建一个class文件对象 2. javaBean:数据库中的表和java中的 ...

  8. java—使用反射对类进行操作(Class对象获取类名,包名,父类,接口,构造方法,普通方法,属性)

    (一)Class对象获取类名,包名,父类,接口 前提条件: 有两个接口IMessage,SystemEdition 一个父类Father 一个子类Son继承父类,实现两个接口IMessage,Syst ...

  9. java 获取参数的类型_java反射获取方法名称,参数类型

    package com.mysec.reflex; import java.lang.reflect.Constructor; import java.lang.reflect.Field; impo ...

最新文章

  1. 《中国人工智能学会通讯》——5.15 案例速览
  2. Packet Tracer 5.0配置cisco路由器详细说明
  3. sdut 3335 数据结构实验之栈与队列八:栈的基本操作
  4. 学习ansible playbook之前先了解下YAML语法
  5. php ttf 字体 url,window_TTF字体文件如何安装 TTF文件打不开解决方法,TTF文件是Windows系统下的字体文 - phpStudy...
  6. 对象池回收对象_回收对象以提高性能
  7. div与div区别小结
  8. 几种php 删除数组元素方法
  9. git 更换本地目录_git 本地库的使用
  10. C++ lower_bound 与 upper_bound 函数
  11. 超炫酷的HTML5视频播放器 支持手机移动页面
  12. 学html需要什么软件,在上海学html需要学什么软件?
  13. 数据库课设——简单的图书管理系统
  14. CSDN的第一节课的感想,nice!!!
  15. 雅虎搜索架构_雅虎! 想要推动您的网站搜索
  16. HTML/CSS/Javascript在线代码运行网站汇总
  17. 企业等保分几级?企业三级等保堡垒机必备方案
  18. [POI2012]HUR-Warehouse Store(贪心,堆)
  19. mybatis 中文官网
  20. 星星是怎么来的?—— CG短片《繁星》幕后分享

热门文章

  1. 图像分类在乳腺癌检测中的应用
  2. 线下迁移线上,如何使用企业微信打造数字化企业?
  3. 微信公众号开发 自定义分享 从前台到Java后台 调用微信JS接口分享朋友圈
  4. 【JavaScript速成之路】JavaScript数据类型转换
  5. Navicat For MySQL的简单使用(一)
  6. 初学编程者开始Revit 二次开发自学教程
  7. 功能测试用例需要详细到什么程度,完全测试程序是可能的么
  8. mysql 8.0设置密码 (doc命令)
  9. 记录10--fedora 14下安装tftp软件
  10. 高通骁龙X55 5G modem信息图和骁龙X55调制解调器简介