在反射中,要如何利用Class对象获取成员变量,构造方法?
1. 获取成员变量
先创建一个Person类
package Person;
public class Person {
private int age;
private String name;
public String a;
public Person() {
}
public Person(int age,String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
}
}
然后在Demo中利用类名.class来获取类对象,然后
用getFields()方法获取全部成员变量
用getField(String)方法获取指定成员变量。
注意:这两种方法获取的成员变量受到修饰符的限制,只能获取public修饰的成员变量。
代码如下:
package Reflect;
import java.lang.reflect.Field;
import Person.Person;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class pc = Person.class;
//获取全部成员变量
Field[] fs = pc.getFields();
for (Field field : fs) {
System.out.println(field);
}
System.out.println("======");
//获取名字为a的成员变量
Field f = pc.getField("a");
Person p = new Person();
//获取到a的值
Object o = f.get(p);
//设置a的值为'张三'
f.set(p,"张三");
System.out.println(o);
//输出修改后的p对象
System.out.println(p);
}
}
注意:
有两种方法能直接无视修饰符直接获取到成员变量。
getDeclaredFields()和getDeclaredField(String)方法。
//获取所有的成员变量
Field[] f1 = pc.getDeclaredFields();
for (Field field : f1) {
System.out.println(field);
}
但是getDeclaredField(String)在获取private修饰的成员变量时会报错。
这时候就要采用暴力反射。
//获取Person中private修饰的age
Field f2 = pc.getDeclaredField("age");
//暴力反射
f2.setAccessible(true);
System.out.println(f2);
2. 获取构造方法
import java.lang.reflect.Constructor;
import Person.Person;
public class ReflectDemo03 {
public static void main(String[] args) throws Exception {
Class Personclass = Person.class;
//有参构造方法
Constructor constructor = Personclass.getConstructor(int.class,String.class);
System.out.println(constructor);
System.out.println("------------");
//创建对象
Object ob = constructor.newInstance(20,"张三");
System.out.println(ob);
}
}