反射机制:在程序运行状态中,动态的获取对象的信息和调用对象的方法
反射的功能:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的实例
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
获取反射的三种方式:
- 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);