反射机制:在程序运行状态中,动态的获取对象的信息和调用对象的方法
反射的功能:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的实例
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
获取反射的三种方式:
- Class.forName(全类名(包名+类名))
- 类名.class
- 对象.getClass()
Class<?> clazz = Class.forName("com.bean.Student");
clazz.getMethods(); //获取所有的公共的方法
clazz.getInterfaces(); //获取所有的接口
clazz.getSuperclass();//获取所有的父类
clazz.getConstructors();//获取所有的构造函数
//如果要获取私有的 : 加上Declared
clazz.getDeclaredMethods();//获取所有的方法 包括私有方法
//通过Class对象获取实例
Student s = (Student) clazz.newInstance();
//获取具体属性
Field nameField = clazz.getField("name");
//操作属性
nameField.set(s, "zxf"); //就相当于 s.setName("zxf");
/*
* 如果操作的是私有属性 需要暂时打开访问权限
* nameField.setAccessible(true); 再进行操作 -->对于方法和构造函数也是一样
*/
//获取具体方法
Method method1 = clazz.getMethod("showInformation", null); //第二个参数是该方法的参数类型
method1.invoke(s, null); //执行方法
//获取具体构造函数
Constructor constructor = clazz.getConstructor(null); //获取无参构造函数
Student s1 = (Student) constructor.newInstance(null); //通过构造方法获取实例
反射可以越过泛型检查:
List<Integer> list = new ArrayList<Integer>(); list.add(12); list.add(34); Class listClass = list.getClass(); Method addMethod = listClass.getMethod("add", Object.class); ///第二个参数是:所获取的方法的参数类型 addMethod.invoke(list, "1234"); System.out.println(list);