JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法。这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制。
简单来说, 就可以把.class文件比做动物的尸体, 而反射技术就是对尸体的一种解剖.通过反射技术, 我们可以拿到该字节码文件中所有的东西, 例如成员变量, 成员方法, 构造方法, 而且还包括私有。
字节码文件的三种获取方式:
对象名.getCalss(); // 次方法来自于Object对象已经存在的情况下,可以使用这种方式
类名.class//类名.class这是一个静态的属性,只要知道类名,就可以获取
Class.forName(“com.lfh.Student”); // 通过Class类中的静态方法,指定字符串,该字符串是类的全类名(包名+类名)
获取构造方法:
//获取字节码对象 Class clazz = Class.forName("myReflectDemo.student1"); //调用无参数构造方法 Constructor cs =clazz.getConstructor(); //System.out.println(cs); //调用有参数构造方法 Constructor css = clazz.getConstructor(String.class,int.class); Object obj =css.newInstance("zhangsan",15); System.out.println(css); System.out.println(obj); System.out.println("---------------"); //可以直接使用clazz.newInstance(),直接调用!!! Object obj1 = clazz.newInstance(); System.out.println(obj1);
获取成员变量:
Class clazz = Class.forName("myReflectDemo.student1"); Object obj = clazz.newInstance(); // 访问所有的成员变量 返回数组 Field[] f = clazz.getDeclaredFields(); for (int i = 0; i < f.length; i++) { Field field = f[i]; System.out.println(field); } // 返回指定的私有成员变量 Field name = clazz.getDeclaredField("name"); Field age = clazz.getDeclaredField("age"); age.set(obj, 18); System.out.println(age.get(obj)); // 私有成员变量必须设置开关 不然无法访问和修改!!!(让jvm不检查权限) name.setAccessible(true); // 传进来的是obj [ clazz.newInstance() ] 不是name name.set(obj, "lisi"); System.out.println(name.get(obj));
获取成员方法:
Class clazz = Class.forName("myReflectDemo.student1"); Object obj = clazz.newInstance(); /*返回所有方法 * Method[] md =clazz.getDeclaredMethods(); for (int i = 0; i < md.length; i++) { Method method = md[i]; System.out.println(method); }*/ //获取无参数无返回值的方法 Method m = clazz.getDeclaredMethod("method"); m.invoke(obj); //获取有参数无返回值的方法 Method m2 =clazz.getDeclaredMethod("method",String.class); m2.invoke(obj, "信息"); //获取无参数有返回值的方法 Method m3 =clazz.getDeclaredMethod("getName"); System.out.println(m3.invoke(obj));