个人文章地址
一、反射概念
在程序运行过程中,可以直接获取一个类的所有属性、成员方法、构造方法
简单理解就是,通过反射,可以将类中的变量、成员方法、构造方法各自封装成一个对象供我们使用。在反射面前,类的信息都是透明的。
二、获取反射类的三种方法
方法一:通过实例化对象获取
Class studentClass = student.getClass();
方法二:直接用路径获取
Class studentClass = Class.forName(“Reflect.Student”);
方法三:通过该类直接获取
Class studentClass = Student.class;
其中student为实例化的对象,Reflect.Student为Student类所在的路径,可结合下方的例子中理解
三、获取类中的变量、成员方法、构造方法的方式
1. 获取成员变量
//获取所有public修饰的变量
Field[] getFields()
//获取指定字段的public修饰的变量
Field getField(String name)
//获取所有变量
Field[] getDeclaredFields()
//获取指定变量
Field getDeclaredField(String name)
2. 获取构造方法
//获取所有public修饰的构造方法
Constructor<?>[] getConstructors()
//获取指定字段的public修饰的构造方法
Constructor<T> getConstructor(类<?>... parameterTypes)
//获取所有构造方法
Constructor<?>[] getDeclaredConstructors()
//获取指定构造方法
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
3. 获取成员方法
//获取所有public修饰的成员方法
Method[] getMethods()
//获取指定字段的public修饰的成员方法
Method getMethod(String name, 类<?>... parameterTypes)
//获取所有成员方法
Method[] getDeclaredMethods()
//获取指定成员方法
Method getDeclaredMethod(String name, 类<?>... parameterTypes)
四、通过反射在其它类中访问并修改对象的私有变量
1. 目录:Student为类对象、ReflecrTest为测试类
2. 代码示例
Student.java
package Reflect;
public class Student {
public String name;//姓名
public String sex;//性别
private int age;//年龄
//构造方法
public Student(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
ReflectTest.java
package Reflect;
import java.lang.reflect.Field;
public class ReflectTest {
public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException, ClassNotFoundException {
//实例化对象
Student student = new Student("小明","男",18);
//正常通过对象的get方法访问private(age)变量
System.out.println("正常通过对象的get方法访问私有变量:age为" + student.getAge());
/*
获取反射类
方法一:通过实例化对象获取
Class studentClass = student.getClass();
方法二:直接用路径获取
Class studentClass = Class.forName("Reflect.Student");
*/
//方法三:通过该类直接获取
Class studentClass = Student.class;
//获取所有字段为age的变量
Field field = studentClass.getDeclaredField("age");
//设置忽略修饰符
field.setAccessible(true);
//获取成员变量age的值
Object age = field.get(student);
System.out.println("通过反射直接获取私有变量:age为" + age);
//通过放射修改私有变量
field.set(student,22);
//输出该对象信息
System.out.println("修改后的对象信息:\n" + student);
}
}
结果:
因此,可以通过反射,我们可以获取到所有类型的类信息,并且可以修改类的信息,当然,反射的用法不止如此,这里就不细说了~