文章目录
- 前言
- 一、访问成员变量的方法
- 二、Field类
- 1.常用方法
- 2.实操展示
- 总结
前言
为了实现随时随地调用某个类的某个成员变量,我们可以通过反射的Field类进行调用。这其中需要我们获取该类的Class对象,再调用Field类的相关方法,实时地灵活地调用或改变成员变量。记得添加try-catch语句并且是java.lang包下的方法。
一、获取成员变量的方法
Field类型的对象是指以成员变量为对象的变量。在我们获取该成员变量时,根据需要指定Field类型对象是否为数组。
方法 | 功能描述 |
getFields() | 获取该类的所有公有的成员变量 |
getField(String name) | 获取指定的该类中的公开的成员变量(name字符串决定) |
getDeciaredFields() | 获取该类的所有成员变量 |
getDeclaredField(String name) | 获取指定的该类的成员变量 |
实操展示:将Demo类实例化,再转化为Class类对象,Field对象通过以上方法获取其中的成员属性。
Class Demo{
public int id="101";
private String name="王五";
}
Demo demo = new Demo();
Class class = demo.getClass;
Field f1[] = class.getFields();
//获取Demo类的所有的公有的成员变量
Field f2 = class.getDeclaredField("name");
//获取Demo类中私有成员属性"name"
二、Field类
1.常用方法
以下时Field类的常用方法:
方法 | 功能描述 |
getName() | 获得该成员变量的名称 |
getType() | 获得表示该成员变量类型的Class对象 |
get(Object obj) | 获得指定对象obj中成员变量的值,返回值为Object型 |
set(Object obj,Object value) | 将指定的obj类中的成员变量的值设置为value |
getInt(Object obj) | 获得指定类中类型为int的成员变量的值 |
setInt(Object obj,int i) | 将指定的obj类中的int类型的成员变量的值设置为value |
getFloat(Object obj) | 获得指定对象obj类中类型为float的成员变量的值 |
setFloat(Object obj,Float f) | 将指定对象obj中类型为float的成员变量的值设置为f |
getBoolean(Object obj) | 获得指定对象obj中类型为boolean的成员变量的值 |
setBoolean(Object obj,boolean z) | j将指定对象obj中类型为boolean的成员变量的值设置为z |
setAccessible(boolean falg) | 设置为true时忽略private修饰符私有权限,直接访问成员变量 |
getModifiers() | 获得可以解析出该成员变量所采用修饰符的整数值 |
注意:以上方法大部分需要写在try-catch语句中,具体看问题报错。
2.实操展示
实例:创建一个Demo类,在其中创建各种成员变量;创建一个See类,使用上述方法获取Demo类成员变量的详细信息;创建Use类,使用上述方法获取成员变量数值,或者改变其值。
Demo类:
public class Demo {
public String name;
public int age;
private int id; //私有
}
See类:
import java.lang.reflect.*;
public class See {
public static void main(String[] args) {
Demo demo = new Demo();
Class class1=demo.getClass();
try {
Field field[] = class1.getDeclaredFields(); //获取Demo的Class类所有成员变量属性
for(int i=0;i<field.length;i++){
System.out.println("成员变量的名称:"+field[i].getName());
System.out.println("成员变量的类型:"+field[i].getType());
System.out.println("成员变量的修饰符权限"+Modifier.toString(field[i].getModifiers()));
System.out.println("------------------------------");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
通过getDeciaredFields()方法将Demo类成员变量转化为Field类对象,使用Field类常用方法即可在该类main方法中获取到Demo类成员方法的详细情况。
Use类:
import java.lang.reflect.*;
public class Use {
public static void main(String[] args) {
Demo demo = new Demo();
Class class1 = demo.getClass();
Field field[] = class1.getDeclaredFields();
for(int i=0;i<field.length;i++){
try {
System.out.println("输出"+field[i].getName()+"成员变量原本的值:"+field[i].get(demo));
Class fieldType = field[i].getType(); //Field类常用方法
System.out.println("数据类型:"+fieldType);
if(fieldType.equals(int.class)){//判断该成员变量的类型是否为int
System.out.println("使用setInt()方法修改成员变量");
field[i].setInt(demo, 20);
}else if(fieldType.equals(String.class)){//判断该成员变量类型是否为String
System.out.println("使用set()方法修改成员变量");
field[i].set(demo,"王五");
}
System.out.println("修改后的值为:"+field[i].get(demo));
System.out.println("-------------------------------------");
} catch (Exception e) {
System.out.println("try-catch捕捉到异常,使用setAccessible()方法更改成员变量权限");
field[i].setAccessible(true);
try {
System.out.println("输出"+field[i].getName()+"成员变量原本的值:"+field[i].get(demo));
System.out.println("使用setInt()方法修改成员变量");
field[i].setInt(demo, 101); //将私有权限的成员变量修改数值
System.out.println("修改后的值为:"+field[i].get(demo));
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
}
运行结果:
通过使用Field类的常用方法get()和set(),实时地获取和修改该类对象的成员变量的值。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了访问成员变量的使用,而Field类提供了大量能使我们便捷地实时处理数据的方法,指正和补充的内容欢迎在评论区中留言。