通过下列任意一个方法访问成员变量时将返回 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通过反射访问成员变量相关推荐

  1. java 反射 成员变量_java使用反射访问成员变量的值示例

    本文实例讲述了java使用反射访问成员变量的值.分享给大家供大家参考,具体如下: 一 代码 import java.lang.reflect.*; class Person { private Str ...

  2. java程序如何访问成员变量,java如何访问成员变量

    通过Class对象的getField()方法,可以获得这种包含的所有或指定的成员变量Field,Filed提供以下两种方法阅读和设定成员变量值 1.getxx(Objectobj): 获得obj对象的 ...

  3. Java中反射获取成员变量、构造方法、成员方法及类名

    都说反射是框架的灵魂,但是反射到底是啥呢,今天就聊聊反射的基础操作,也是必备操作. 反射机制是在程序运行时,对任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用他的任意一个属性和 ...

  4. [Java基础]反射获取成员变量并使用

    代码如下: package ClassObjectPack;public class Student {private String name;int age;public String addres ...

  5. [Java基础]反射获取成员变量并使用练习

    代码如下: package ClassObjectPack;public class Student {private String name;int age;public String addres ...

  6. java 27 - 4 反射之 通过反射获取成员变量并使用

    类Field: 提供有关类或接口的单个字段的信息,以及对它的动态访问权限. A:获得类的成员变量 数组: 1.getFields(公共类的) 2.getDeclaredFields(所有类型的) B: ...

  7. java 反射 成员变量_java基础--反射(成员变量)

    这里介绍通过反射获取对象的成员变量,以及修改成员变量. package Reflect.field; public class Point { int y; public int getY() { r ...

  8. 反射:通过反射获取成员变量并使用

    首先建一个实体类,用于数据访问 package star.july.entity;public class Student {private String name;int age;public St ...

  9. java什么是局部变量,什么是java的局部变量,成员变量,全局变量?

    public class Test { private String name;//成员变量,也是全局变量 public void changeName() { String n = "to ...

最新文章

  1. 使用ajax不刷新页面获取、操作数据
  2. 中国人民大学2016考研复试基本分数线
  3. eclipse+webservice开发实例
  4. 【算法】 - 动态规划 + 位运算
  5. 【Linux】Ubuntu 18下安装Vim自动补全插件YouCompleteMe(可高速下载安装)
  6. 并行计算——基础并行计算
  7. SQLServer 可更新订阅数据冲突的一个原因
  8. 毕设题目:Matlab优化调度
  9. 计算机中程序员计算是怎么计算,程序员计算器
  10. 几点减几点怎么列算式_时间加减法怎么算
  11. TPP并不可怕,可怕的是我们开始自我封闭
  12. H6062FNL 普思Pulse 网络变压器
  13. 老树开新花:DLL劫持漏洞新玩法
  14. 计算机架构设计的 8 个伟大思想
  15. 川土微电子CA-IS1300用于电流检测的隔离运放新品上市
  16. 人脸识别——FaceBook的DeepFace、Google的FaceNet、DeepID
  17. jacob java excel_使用 Jacob 操作Excel、Word文件
  18. 项目管理中的成本计算
  19. taobao.item_sku获取sku详细信息 API接口的调用
  20. 微软签约云南 将在云南建IT学院和软件中心

热门文章

  1. python输出文本内容_python 打印文件里的内容
  2. 钉钉一个人怎么多部门 钉钉一个人加入多个部门的技巧
  3. 怎么在pptv里下载电视剧
  4. PP视频怎么设置文件的缓存路径
  5. Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)编码前数据接入类型总结
  6. 分布式和微服务的区别
  7. Arrays.asList()和Collections.singletonList()比较
  8. git的clone命令出现fatal:unable to access ‘https://github.comXXXXXXX“:OpenSSL SSL_read:connection was errn
  9. java函数调用约定_2020-09-04:函数调用约定了解么?
  10. python使用蓝牙功能_python bluetooth蓝牙信息获取蓝牙设备类型的方法