1、反射的概念
idea的提示,反射就是可以从类里面获取东西:成员变量,成员方法,构造方法
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
2、获取Class的三种方式 (Class)
1)Class.forName("全类名") 源代码阶段
2)类名.class 加载阶段
3)对象.getClass(); 运行阶段
public class ReflectDemo01 { public static void main(String[] args) throws ClassNotFoundException { // 第一种方式 Class.forName("全类名") Chapter08.Student 最常用 Class clazz = Class.forName("Chapter08.Student"); System.out.println(clazz); // class Chapter08.Student // 第二种方式 类名.class 当成参数进行传递 Class clazz2 = Student.class; System.out.println(clazz2); // class Chapter08.Student // 第三种方式 对象.getClass() 当有了这个类的对象时,才能够使用 Student s = new Student(); Class clazz3 = s.getClass(); System.out.println(clazz3); // class Chapter08.Student } }
3、获取构造方法 (Constructor)
public class ReflectDemo02 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { // 1. 获取Class对象 Class clazz = Class.forName("Chapter08.Student"); // 2. 获取构造方法 // 获取所有公共构造方法 公共 Constructor[] constructors = clazz.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor); } // 获取所有构造方法 公共 + 私有 Constructor[] declaredConstructors = clazz.getDeclaredConstructors(); for (Constructor constructor : declaredConstructors) { System.out.println(constructor); } // 获取单个 Constructor con = clazz.getDeclaredConstructor(); System.out.println(con); Constructor con2 = clazz.getDeclaredConstructor(String.class); System.out.println(con2); Constructor con3 = clazz.getDeclaredConstructor(int.class); System.out.println(con3); Constructor con4 = clazz.getDeclaredConstructor(String.class,int.class); // 获取修饰符 int modifiers = con4.getModifiers(); System.out.println(modifiers); // Ctrl+P 可查看能调用的方法 // Student student = new Student(); // 获取参数 Parameter[] parameters = con4.getParameters(); for (Parameter parameter : parameters) { System.out.println(parameter); } // 创建Student对象 临时取消安全检查权限检查:暴力反射 con4.setAccessible(true); Student student = (Student) con4.newInstance("张三", 18); System.out.println(student); } }
4、获取成员变量 (File)
// 获取成员变量 public class ReflectDemo03 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { Class clazz = Class.forName("Chapter08.Student"); // 获取成员变量 // getFields 获取public修饰的成员变量 Field[] fields = clazz.getFields(); for (Field field : fields) { System.out.println(field); } // getDeclaredFields 获取所有成员变量 Field[] declaredFields = clazz.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println(declaredFields); } // 获取 public 指定成员变量 Field gender = clazz.getField("gender"); System.out.println(gender); // 获取 私有 指定成员变量 Field name = clazz.getDeclaredField("name"); System.out.println(name); // 获取权限修饰符 int genderMod = gender.getModifiers(); System.out.println(genderMod); // 获取成员变量名 String gn = gender.getName(); System.out.println(gn); // 获取数据类型 Class type = gender.getType(); System.out.println(type); // 记录成员变量记录的值 Student S = new Student("zhangsan",23,"男"); String value = (String) gender.get(S); System.out.println(value); // 修改成员变量的值 gender.set(S,"女"); System.out.println(S); } }
5、获取成员方法 (Method)
// 获取成员方法 public class ReflectDemo04 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException { // 获取Class对象 Class clazz = Class.forName("Chapter08.Student"); // 获取所有 公共成员方法 Method[] method = clazz.getMethods(); for (Method m : method) { System.out.println(m); } // 获取所有成员方法 Method[] DeclaredMethod = clazz.getDeclaredMethods(); for (Method dm : DeclaredMethod) { System.out.println(dm); } // 返回单个成员方法 Method m = clazz.getMethod("setName", String.class); // 返回单个私有成员方法 Method dm = clazz.getDeclaredMethod("setGender", String.class); // 获取方法的修饰符 System.out.println(Modifier.toString(m.getModifiers())); // 获取方法的类型 System.out.println(m.getReturnType()); //获取方法的参数 Parameter[] parameters = m.getParameters(); for (Parameter parameter : parameters) { System.out.println(parameter); } // 获取方法的参数类型 Class[] parameterTypes = m.getParameterTypes(); for (Class parameterType : parameterTypes) { System.out.println(parameterType); } // 获取到方法的返回值类型 Class returnType = m.getReturnType(); System.out.println(returnType); // 获取到方法的异常类型 Class[] exceptionTypes = m.getExceptionTypes(); for (Class exceptionType : exceptionTypes) { System.out.println(exceptionType); } // 方法运行 Student student = (Student) clazz.newInstance(); m.invoke(student, "张三"); System.out.println(student); // 运行私有方法 取消访问权限 dm.setAccessible(true); dm.invoke(student, "男"); System.out.println(student); } }