03. Java如何通过反射获取成员变量
获取Class对象之后,使用下列任何一个方法访问成员变量时,将返回Field类型的对象或数组:
- getFields()
- getField(String name)
- getDeclaredFields()
- getDeclaredField(String name)
Filed类常用方法表:
方法名称 |
说明 |
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 2 3 4 5 6
| public class Book2 { String name; public int id; private float price; protected boolean isLoan; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| public static void main(String[] args) { Book2 book = new Book2(); Class class1 = book.getClass(); Field[] declaredFields = class1.getDeclaredFields(); for (Field field : declaredFields) { System.out.println("成员名称为:" + field.getName()); Class fieldType = field.getType(); System.out.println("成员类型为:" + fieldType); boolean isTurn = true; while (isTurn) { try { isTurn = false; System.out.println("修改前成员的值为:" + field.get(book)); if (fieldType.equals(int.class)) { System.out.println("利用setInt()方法修改成员的值"); field.setInt(book, 100); } else if (fieldType.equals(float.class)) { System.out.println("利用setFloat()方法修改成员的值"); field.setFloat(book, 29.815f); } else if (fieldType.equals(boolean.class)) { 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"); } }
|