反射的三种实现方式
Class<?> aClass1 = Class.forname(model.StudentModel); //最常使用 括号里 全限定名 包名+类名 选中文件,ctrl + shift + alt + c 获取
Class<?> aClass2 = Student.class;
Class<?> aClass3 = Student.getClass();
反射获取构造方法
无参
Constructor<?> constructor = aClass.getConstructor();
有参
Constructor<?> constructor1 = aClass.getConstructor(String.class, Integer.class);
私有有参
Constructor<?> constructor2 = aClass.getDeclaredConstructor(String.class);
私有方法的获取需要在 get 后加上 Declared
获取所有构造方法(返回一个数组)
Constructor<?>[] constructors = aClass.getConstructors();
通过反射获取的构造方法实例化对象
Object o = constructor.newInstance();
Object lisi = constructor1.newInstance("lisi", 22);
// 私有方法使用时需要设置 取消访问检查
constructor2.setAccessible(true);
Object zhangsan = constructor2.newInstance("zhangsan");
私有方法在使用前需要通过 方法实例化对象.setAccessible(true) 设置权限
反射获取成员变量(字段名)
// 公有
Field field = aClass.getField("address");
System.out.println(field);
// 私有
Field field1 = aClass.getDeclaredField("name");
System.out.println(field1);
私有字段的获取需要在 get 后加上 Declared
字段赋值
// 给反射的类的字段赋值
Student stu = new Student();
field.set(stu, "成都");
// 私有字段赋值需要设置权限
field1.setAccessible(true);
field1.set(stu,"王五");
私有字段在赋值前需要通过 方法实例化对象.setAccessible(true) 设置权限
反射获取成员属性(方法)
// 无参数方法
Method method = aClass.getMethod("study");
// 有参数私有方法
Method method1 = aClass.getDeclaredMethod("speak", String.class);
反射获取的方法使用
// 公有,无参
method.invoke(stu);
// 私有,有参
method1.setAccessible(true);
method1.invoke(stu,"立方");
反射所有代码需要在try……catch……中使用,捕获异常
Student 类的定义
package util;
public class Student {
private String name;
private Integer age;
public String address;
public Student() {
System.out.println("无参构造");
}
public Student(String name, Integer age) {
System.out.println("有参构造");
}
private Student(String name) {
System.out.println("私有有参构造");
}
public void study(){
System.out.println("类方法");
}
private void speak(String name){
System.out.println("私有类方法");
}
}