在程序运行过程中,可以直接获取一个类的所有属性、成员方法、构造方法 简单理解就是,通过反射,可以将类中的变量、成员方法、构造方法各自封装成一个对象供我们使用。在反射面前,类的信息都是透明的。
方法一:通过实例化对象获取 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); } }结果:
因此,可以通过反射,我们可以获取到所有类型的类信息,并且可以修改类的信息,当然,反射的用法不止如此,这里就不细说了~
