一、什么是反射:
在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法(包括私有的方法和属性),对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的功能就称为java语言的反射机制。通俗点讲,通过反射可以获取该类所有的属性和方法。
二、API 使用:
public static void test() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException { // 1、获取字节码文件的三种方法 Class psnClass = Class.forName("model.Person"); //通过Class类中的静态方法forName,直接获取到一个类的字节码文件对象,此时该类还是源文件阶段,并没有变为字节码文件。 Class psnClass2 = Person.class; // 当类被加载成.class文件时,此时Person类变成了.class,在获取该字节码文件对象,也就是获取自己, 该类处于字节码阶段。 Person s = new Person(); Class psnClass3 = s.getClass(); // 通过类的实例获取该类的字节码文件对象,该类处于创建对象阶段 //通过字节码对象调用无参构造器创建Person实例对象 Person person = (Person) psnClass.newInstance(); person.getNameAndAge(); //通过字节码对象获取有参构造器对象,创建Person实例对象 Constructor constructor = psnClass.getConstructor(int.class, String.class); Person person1= (Person) constructor.newInstance(18,"wu"); person1.getNameAndAge(); Constructor[] constructors = psnClass.getConstructors(); for (Constructor c : constructors) { System.out.println("构造器:" + c.getName()); } // 获得指定方法 Method getName = psnClass.getDeclaredMethod("getName"); getName.setAccessible(true); // 设置可访问 getName.invoke(person); // 执行方法 Method[] declaredMethods = psnClass.getDeclaredMethods(); for (Method m : declaredMethods) { System.out.println("方法名: " + m.getName()); m.setAccessible(true); m.invoke(person1); } // 获得私有属性 Field name = psnClass.getDeclaredField("name"); name.setAccessible(true); name.set(person,"li"); Method getNameLi = psnClass.getDeclaredMethod("getName"); getName.setAccessible(true); getName.invoke(person); Field[] fields = psnClass.getDeclaredFields(); for (Field f : fields) { System.out.println("成员变量: " + f.getName()); } }