之前给大家介绍了java通过反射执行方法的内容,那么下面要给大家介绍的就是java通过反射访问成员变量的内容,一起来看看吧。
通过下面的任意一个方法访问成员变量的时候,将返回Field类型的对象或数组。
上面的方法返回的Field对象代表一个成员变量,例,访问一个名称是price的成员变量,示例代码:
object.getDeciaredField("price");
Field类的常用方法:
示例:
下面的话,就让我们通过一个案例来演示一下怎样调用Field类的方法获取动态类中各个成员的信息。
首先的话,要先创建一个Book2类,在这个类当中,依次声明一个String、int、float以及boolean类型的成员,并且,设置不同的访问作用域,Book2类代码:
public class Book2 { String name; public int id; private float price; protected boolean isLoan; }
编写测试类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.815 f); } 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"); } } }
运行测试类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 =============================
这个方面的知识就给你介绍到这里啦,更多和java反射相关的java基础知识,可以继续的通过关注奇Q工具网来进行了解呢。
推荐阅读: