反射允许对成员变量,成员方法和构造方法的信息进行编程访问
idea中的提示就是反射的功能
反射需要获取字节码class文件,在通过class对象来获取字段,构造方法,成员方法,最后从这些中解剖出修饰符,名字等等信息
源代码阶段:用一
加载阶段:用二
运行阶段:用三
构造方法的对象:Constructor
字段(成员变量)的对象:Field
成员方法的对象:Method
反射获取构造方法
javastatic void main() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { //获取class对象 Class clazz = Class.forName("reflect2.Student"); //获取构造方法(getConstructors只能获取public修饰的构造方法) /*Constructor[] cons = clazz.getConstructors(); for (Constructor con : cons) { System.out.println(con); }*/ //获取构造方法(getDeclaredConstructors可以获取全部的构造方法) /*Constructor[] cons = clazz.getDeclaredConstructors(); for (Constructor con : cons) { System.out.println(con); }*/ //无参构造的方法 Constructor con1 = clazz.getDeclaredConstructor(); System.out.println(con1); //public Student(String name) Constructor con2 = clazz.getDeclaredConstructor(String.class); System.out.println(con2); //protected Student(int age) Constructor con3 = clazz.getDeclaredConstructor(int.class); System.out.println(con3); // private Student(String name, int age) Constructor con4 = clazz.getDeclaredConstructor(String.class,int.class); System.out.println(con4); //显示用什么修饰符 //1表示public //2表示private int modifiers = con4.getModifiers(); System.out.println(modifiers); //参数里是String,int修饰的 Parameter[] parameters = con4.getParameters(); for (Parameter parameter : parameters) { System.out.println(parameter); } //暴力反射:表示临时取消权限校验 con4.setAccessible(true); Student stu = (Student) con4.newInstance("张三", 10); System.out.println(stu); }Student类:
javapublic class Student { private String name; private int age; public Student() { } public Student(String name){ this.name = name; } protected Student(int age){ this.age = age; } private Student(String name, int age) { this.name = name; this.age = age; } /** * 获取 * @return name */ public String getName() { return name; } /** * 设置 * @param name */ public void setName(String name) { this.name = name; } /** * 获取 * @return age */ public int getAge() { return age; } /** * 设置 * @param age */ public void setAge(int age) { this.age = age; } public String toString() { return "Student{name = " + name + ", age = " + age + "}"; } }结果:
反射获取成员变量:

MyReflectDemo类:
javastatic void main() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { Class clazz = Class.forName("reflect3.Student"); //获取所有的成员变量 /*Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { System.out.println(field); }*/ //获取单个的成员变量 Field names = clazz.getDeclaredField("name"); System.out.println(names); //获取权限修饰符 int modifiers = names.getModifiers(); System.out.println(modifiers); //获取成员变量的名字 String str = names.getName(); System.out.println(str); //获取成员变量的数据类型 Class<?> type = names.getType(); System.out.println(type); //获取成员变量记录的值 Student s = new Student("zhangsan",10,"男"); names.setAccessible(true); Object value = names.get(s); System.out.println(value); //修改对象里面记录的值 names.set(s,"lisi"); System.out.println(s); }Student类:
javaprivate String name; private int age; public String gender;输出结果:
'\
反射获取成员方法:





'\