8.23Java反射访问成员变量
作者:互联网
8.23Java反射访问成员变量
访问成员变量的方法
-
getFields()
-
getField(String name)
-
getDeclaredFields()
-
getDeclaredField(String name)
会返回一个Field对象,代表一个成员变量
object.getDeciaredField("price");
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() | 获得可以解析出该方法所采用修饰符的整数 |
示例:
package PracticeReview.Reflect;
/**
* 反射训练类,用于练习
* @since JDK 1.8
* @date 2021/08/23
* @author Lucifer
*/
public class ReflectPracticeDemoNo3 {
String name;
public int id;
private float price;
protected boolean isLoan;
}
访问成员变量测试类:
package PracticeReview.Reflect;
import java.lang.reflect.Field;
public class ReflectTestNo3 {
public static void main(String[] args) {
ReflectPracticeDemoNo3 reflectPracticeDemoNo3 = new ReflectPracticeDemoNo3();
//获取动态类
Class class1 = reflectPracticeDemoNo3.getClass();
// 获取ReflectPracticeDemoNo3类的所有成员
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(reflectPracticeDemoNo3));
// 判断成员类型是否为int
if (fieldType.equals(int.class)) {
System.out.println("利用setInt()方法修改成员的值");
field.setInt(reflectPracticeDemoNo3, 100);
} else if (fieldType.equals(float.class)) {
// 判断成员变量类型是否为float
System.out.println("利用setFloat()方法修改成员的值");
field.setFloat(reflectPracticeDemoNo3, 29.815f);
} else if (fieldType.equals(boolean.class)) {
// 判断成员变量是否为boolean
System.out.println("利用setBoolean()方法修改成员的值");
field.setBoolean(reflectPracticeDemoNo3, true);
} else {
System.out.println("利用set()方法修改成员的值");
field.set(reflectPracticeDemoNo3, "Java编程");
}
System.out.println("修改后成员的值为:" + field.get(reflectPracticeDemoNo3));
} catch (Exception e) {
System.out.println("在设置成员变量值时抛出异常,下面执行setAccessible()方法");
field.setAccessible(true);
isTurn = true;
}
}
}
}
}
标签:反射,Java,变量,成员,System,field,8.23,println,obj 来源: https://www.cnblogs.com/JunkingBoy/p/15177398.html