Java通过反射访问成员变量
通过下列任意一个方法访问成员变量时将返回 Field 类型的对象或数组。
getFields()getField(String name)getDeclaredFields()getDeclaredField(String name)
上述方法返回的 Field 对象代表一个成员变量。例如,要访问一个名称为 price 的成员变量,示例代码如下:
object.getDeciaredField("price");
Field类的常用方法
方法名称 | 说明 |
---|---|
getName() | 获得该成员变量的名称 |
getType() | 获取表示该成员变量的 Class 对象 |
get(Object obj) | 获得指定对象 obj 中成员变量的值,返回值为 Object 类型 |
set(Object obj, Object value) | 将指定对象 obj 中成员变量的值设置为 value |
getlnt(0bject obj) | 获得指定对象 obj 中成员类型为 int 的成员变量的值 |
setlnt(0bject obj, int i) | 将指定对象 obj 中成员变量的值设置为 i |
setFloat(Object obj, float f) | 将指定对象 obj 中成员变量的值设置为 f |
getBoolean(Object obj) | 获得指定对象 obj 中成员类型为 boolean 的成员变量的值 |
setBoolean(Object obj, boolean b) | 将指定对象 obj 中成员变量的值设置为 b |
getFloat(Object obj) | 获得指定对象 obj 中成员类型为 float 的成员变量的值 |
setAccessible(boolean flag) | 此方法可以设置是否忽略权限直接访问 private 等私有权限的成员变量 |
getModifiers() | 获得可以解析出该方法所采用修饰符的整数 |
示例如何调用 Field 类的方法获取动态类中各个成员的信息。
1 . 首先创建一个 Book 类,在该类中依次声明一个 String、int、float 和 boolean 类型的成员,并设置不同的访问作用域。Book 类最终的代码如下:
public class Book {String name;public int id;private float price;protected boolean isLoan;
}
2)编写测试类 Test,在该类的 main() 方法中通过反射访问 Book 类中的所有成员,并将该成员的名称和类型信息输出到控制台。
Test 类的代码如下:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class Test {public static void main(String[] args) {Book book = new Book();// 获取动态类BookClass class1 = book.getClass();// 获取Book类的所有成员Field[] declaredFields = class1.getDeclaredFields();// 遍历所有的成员for(int i = 0;i < declaredFields.length;i++) { // 获取类中的成员变量Field field = declaredFields[i];System.out.println("成员名称为:" + field.getName());Class fieldType = field.getType();System.out.println("成员类型为:" + fieldType);boolean isTurn = true;while(isTurn) {try { // 如果该成员变量的访问权限为private,则抛出异常isTurn = false;System.out.println("修改前成员的值为:" + field.get(book));// 判断成员类型是否为intif(fieldType.equals(int.class)) {System.out.println("利用setInt()方法修改成员的值");field.setInt(book, 100);} else if(fieldType.equals(float.class)) { // 判断成员变量类型是否为floatSystem.out.println("利用setFloat()方法修改成员的值");field.setFloat(book, 29.815f);} else if(fieldType.equals(boolean.class)) { // 判断成员变量是否为booleanSystem.out.println("利用setBoolean()方法修改成员的值");field.setBoolean(book, true);} else {System.out.println("利用set()方法修改成员的值");field.set(book, "Java编程");}System.out.println("修改后成员的值为:" + field.get(book));} catch (Exception e) {System.out.println("在设置成员变量值时抛出异常,下面执行setAccessible()方法");field.setAccessible(true);isTurn = true;}}System.out.println("=============================\n");}}
}
3 . 运行测试类 Test,程序将会依次动态访问 Book 类中的所有成员。访问 name 成员的运行效果如下所示:
成员名称为:name
成员类型为:class java.lang.String
修改前成员的值为:null
利用set()方法修改成员的值
修改后成员的值为:Java编程
=============================
访问 id 成员的运行效果如下所示:
成员名称为:id
成员类型为:int
修改前成员的值为:0
利用setInt()方法修改成员的值
修改后成员的值为:100
=============================
访问 price 成员的运行效果如下所示:
成员名称为:price
成员类型为:float
在设置成员变量值时抛出异常,下面执行setAccessible()方法
修改前成员的值为:0.0
利用setFloat()方法修改成员的值
修改后成员的值为:29.815
=============================
访问 isLoan 成员的运行效果如下所示:
成员名称为:isLoan
成员类型为:boolean
修改前成员的值为:false
利用setBoolean()方法修改成员的值
修改后成员的值为:true
=============================
Java通过反射访问成员变量相关推荐
- java 反射 成员变量_java使用反射访问成员变量的值示例
本文实例讲述了java使用反射访问成员变量的值.分享给大家供大家参考,具体如下: 一 代码 import java.lang.reflect.*; class Person { private Str ...
- java程序如何访问成员变量,java如何访问成员变量
通过Class对象的getField()方法,可以获得这种包含的所有或指定的成员变量Field,Filed提供以下两种方法阅读和设定成员变量值 1.getxx(Objectobj): 获得obj对象的 ...
- Java中反射获取成员变量、构造方法、成员方法及类名
都说反射是框架的灵魂,但是反射到底是啥呢,今天就聊聊反射的基础操作,也是必备操作. 反射机制是在程序运行时,对任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用他的任意一个属性和 ...
- [Java基础]反射获取成员变量并使用
代码如下: package ClassObjectPack;public class Student {private String name;int age;public String addres ...
- [Java基础]反射获取成员变量并使用练习
代码如下: package ClassObjectPack;public class Student {private String name;int age;public String addres ...
- java 27 - 4 反射之 通过反射获取成员变量并使用
类Field: 提供有关类或接口的单个字段的信息,以及对它的动态访问权限. A:获得类的成员变量 数组: 1.getFields(公共类的) 2.getDeclaredFields(所有类型的) B: ...
- java 反射 成员变量_java基础--反射(成员变量)
这里介绍通过反射获取对象的成员变量,以及修改成员变量. package Reflect.field; public class Point { int y; public int getY() { r ...
- 反射:通过反射获取成员变量并使用
首先建一个实体类,用于数据访问 package star.july.entity;public class Student {private String name;int age;public St ...
- java什么是局部变量,什么是java的局部变量,成员变量,全局变量?
public class Test { private String name;//成员变量,也是全局变量 public void changeName() { String n = "to ...
最新文章
- 使用ajax不刷新页面获取、操作数据
- 中国人民大学2016考研复试基本分数线
- eclipse+webservice开发实例
- 【算法】 - 动态规划 + 位运算
- 【Linux】Ubuntu 18下安装Vim自动补全插件YouCompleteMe(可高速下载安装)
- 并行计算——基础并行计算
- SQLServer 可更新订阅数据冲突的一个原因
- 毕设题目:Matlab优化调度
- 计算机中程序员计算是怎么计算,程序员计算器
- 几点减几点怎么列算式_时间加减法怎么算
- TPP并不可怕,可怕的是我们开始自我封闭
- H6062FNL 普思Pulse 网络变压器
- 老树开新花:DLL劫持漏洞新玩法
- 计算机架构设计的 8 个伟大思想
- 川土微电子CA-IS1300用于电流检测的隔离运放新品上市
- 人脸识别——FaceBook的DeepFace、Google的FaceNet、DeepID
- jacob java excel_使用 Jacob 操作Excel、Word文件
- 项目管理中的成本计算
- taobao.item_sku获取sku详细信息 API接口的调用
- 微软签约云南 将在云南建IT学院和软件中心
热门文章
- python输出文本内容_python 打印文件里的内容
- 钉钉一个人怎么多部门 钉钉一个人加入多个部门的技巧
- 怎么在pptv里下载电视剧
- PP视频怎么设置文件的缓存路径
- Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)编码前数据接入类型总结
- 分布式和微服务的区别
- Arrays.asList()和Collections.singletonList()比较
- git的clone命令出现fatal:unable to access ‘https://github.comXXXXXXX“:OpenSSL SSL_read:connection was errn
- java函数调用约定_2020-09-04:函数调用约定了解么?
- python使用蓝牙功能_python bluetooth蓝牙信息获取蓝牙设备类型的方法