反射
通过Java的反射机制,可以在程序中访问已经装载到JVM中的Java对象的描述,实现访问,检测和修改描述Java对象本身信息的功能。通过反射可以访问构造方法,成员变量,和成员方法。
访问构造方法:Java反射——访问构造方法
访问成员方法:Java反射——访问成员方法
访问成员变量
利用Field对象可以操作相应的成员变量。
Field类的常用方法:
方法 | 说明 |
---|---|
getName() | 获取成员变量的名称 |
getType() | 获得表示该成员变量类型的class对象 |
get(Object obj) | 获得指定对象obj中成员变量的值,返回值为Object型 |
set(Object obj, Object value) | 将指定对象obj中成员变量的值设为value |
getInt(Object obj) | 获得指定对象obj中类型为int的成员变量的值 |
setInt(Object obj, int i) | 将指定对象obj中类型为int的成员变量的值设置为i |
getFloat((Object obj)) | 获得指定对象obj中类型为float的成员变量的值 |
setFloat(Object obj, float f) | 将指定对象obj中类型为float的成员变量的值设置为f |
getBoolean(Object obj) | 获得指定对象obj中类型为Boolean的成员变量的值 |
setBoolean(Object obj, boolean z) | 将指定对象obj中类型为Boolean的成员变量的值设置为z |
setAccessible(boolean flag) | 此方法可以设置是否忽略权限限制直接访问private等私有权限的成员变量 |
getModifiers() | 获得可以解析出该成员变量所采用修饰符的整数 |
getModifiers()方法的返回值是所表示的修饰符信息,在该类中提供了一系列用来解析的静态方法,既可以查看是否被指定的修饰符修饰,还可以以字符串的形式获得所有修饰符。
Modifier类中的常用解析方法:
静态方法 | 说明 |
---|---|
isPublic(int mod) | 查看是否被public修饰符修饰,如果是返回true,反之返回false |
isProtected(int mod) | 查看是否被protected修饰符修饰,如果是返回true,反之返回false |
isPrivate(int mod) | 查看是否被private修饰符修饰,如果是返回true,反之返回false |
isStatic(int mod) | 查看是否被static修饰符修饰,如果是返回true,反之返回false |
isFinal(int mod) | 查看是否被Final修饰符修饰,如果是返回true,反之返回false |
toString(int mod) | 以字符串形式返回所有修饰符 |
获取和修改成员变量的值:
首先创建一个Study类,在该类中声明三个不同类型,不同修饰符的成员变量,并赋值。
public class Study {
public int id = 1;
public String name = "反射";
private double price = 3.1315;
}
然后在另一个类Study2中反射这三个变量。
public class Study2 {
public static void main(String[] args) {
try {
Class c = Class.forName("study.czm.Study");// 创建class对象
Field fi[] = c.getDeclaredFields();// 获取所有成员变量
for (Field f : fi) {
System.out.print(Modifier.toString(f.getModifiers()) + " ");// 获取成员变量修饰符
System.out.print(f.getType()