java 反射 变量值_Java通过反射访问成员变量

本文详细介绍了Java反射机制中Field类的使用,包括如何获取成员变量、获取和设置变量值,以及处理私有成员的方法。通过示例代码展示了如何访问不同访问权限的成员变量,包括对private变量的处理。
摘要由CSDN通过智能技术生成

通过下列任意一个方法访问成员变量时将返回 Field 类型的对象或数组。

getFields()

getField(String name)

getDeclaredFields()

getDeclaredField(String name)

上述方法返回的 Field 对象代表一个成员变量。例如,要访问一个名称为 price 的成员变量,示例代码如下:

object.getDeciaredField("price");

Field 类的常用方法如表 1 所示

表1 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()

获得可以解析出该方法所采用修饰符的整数

例 1

下面通过一个案例来演示如何调用 Field 类的方法获取动态类中各个成员的信息。

1)首先创建一个 Book2 类,在该类中依次声明一个 String、int、float 和 boolean 类型的成员,并设置不同的访问作用域。Book2 类最终的代码如下:

public class Book2 {

String name;

public int id;

private float price;

protected boolean isLoan;

}

2)编写测试类 Test03,在该类的 main() 方法中通过反射访问 Book2 类中的所有成员,并将该成员的名称和类型信息输出到控制台。

Test03 类的代码如下:

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

public class Test03 {

public static void main(String[] args) {

Book2 book = new Book2();

// 获取动态类Book2

Class class1 = book.getClass();

// 获取Book2类的所有成员

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));

// 判断成员类型是否为int

if(fieldType.equals(int.class)) {

System.out.println("利用setInt()方法修改成员的值");

field.setInt(book, 100);

} else if(fieldType.equals(float.class)) {

// 判断成员变量类型是否为float

System.out.println("利用setFloat()方法修改成员的值");

field.setFloat(book, 29.815f);

} else if(fieldType.equals(boolean.class)) {

// 判断成员变量是否为boolean

System.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)运行测试类 Test03,程序将会依次动态访问 Book2 类中的所有成员。访问 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

=============================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值