java反射获取字段的顺序6_反射之获取字段
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_反射之获取字段相关推荐
- mysql修改字段的顺序_Mysql中如何修改字段的排列顺序?
创建数据表的数据,字段在表中的位置已经确定了.但要修改字段在表中的排列位置,则需要使用ALTER TABLE语句来处理.在MySQL中,修改字段排列位置的基本语法格式如下: ALTER TABLE M ...
- 根据excel列动态创建mysql表_根据数据库字段动态生成excel模版下载,上传模版获取数据存入数据库(poi 反射)...
环境:mysql5.7.28 java8 Spring boot 2.2.4 mybatis-plus3.10 动态:根据需求,用户可以选择对应的字段生成excle模版 下载 poi 反射:poi是e ...
- Java 编程问题:七、Java 反射类、接口、构造器、方法和字段
原文:Java Coding Problems 协议:CC BY-NC-SA 4.0 贡献者:飞龙 本文来自[ApacheCN Java 译文集],自豪地采用谷歌翻译. 本章包括涉及 Java 反射 ...
- Java筑基——反射(1):基本类周边信息获取
相关文章: Java筑基--反射(1):基本类周边信息获取: Java筑基--反射(2):泛型周边信息获取: Java筑基--反射(3):类内部信息获取 目录 1. 前言 2. 正文 2.1 类的生命 ...
- java 反射 父类的属性_用反射的方式获取父类中的所有属性和方法
package com.syh.jdbc.reflection_super; /** * 父类 * @author syh * */ public class Parent { public Stri ...
- java反射 获取方法参数名_java 反射借助 asm 获取参数名称最优雅简单的方式
背景说明 最近写反射相关的代码,想获取对应的参数名称,却发现没有特别好的方式. jdk7 及其以前,是无法通过反射获取参数名称的. jdk8 可以获取,但是要求指定 -parameter 启动参数,限 ...
- java 反射获取修饰符_java之反射和BeanUtils类
反射和BeanUtils类 1. 类的初始化:类什么什么情况下会加载到内存中 只要类加载到内存中,那么类加载器就会为这个类创建一个class文件对象 2. javaBean:数据库中的表和java中的 ...
- java—使用反射对类进行操作(Class对象获取类名,包名,父类,接口,构造方法,普通方法,属性)
(一)Class对象获取类名,包名,父类,接口 前提条件: 有两个接口IMessage,SystemEdition 一个父类Father 一个子类Son继承父类,实现两个接口IMessage,Syst ...
- java 获取参数的类型_java反射获取方法名称,参数类型
package com.mysec.reflex; import java.lang.reflect.Constructor; import java.lang.reflect.Field; impo ...
最新文章
- 《中国人工智能学会通讯》——5.15 案例速览
- Packet Tracer 5.0配置cisco路由器详细说明
- sdut 3335 数据结构实验之栈与队列八:栈的基本操作
- 学习ansible playbook之前先了解下YAML语法
- php ttf 字体 url,window_TTF字体文件如何安装 TTF文件打不开解决方法,TTF文件是Windows系统下的字体文 - phpStudy...
- 对象池回收对象_回收对象以提高性能
- div与div区别小结
- 几种php 删除数组元素方法
- git 更换本地目录_git 本地库的使用
- C++ lower_bound 与 upper_bound 函数
- 超炫酷的HTML5视频播放器 支持手机移动页面
- 学html需要什么软件,在上海学html需要学什么软件?
- 数据库课设——简单的图书管理系统
- CSDN的第一节课的感想,nice!!!
- 雅虎搜索架构_雅虎! 想要推动您的网站搜索
- HTML/CSS/Javascript在线代码运行网站汇总
- 企业等保分几级?企业三级等保堡垒机必备方案
- [POI2012]HUR-Warehouse Store(贪心,堆)
- mybatis 中文官网
- 星星是怎么来的?—— CG短片《繁星》幕后分享