Spring在创建Bean实例、依赖注入和AOP时使用了反射。今天我们将解释反射的概念及其应用。反射机制Java反射是Java被认为是动态(或准动态)语言的一个关键属性。这种机制允许程序在运行时通过反射API获取任何已知名称的类的内部信息和任何对象的内部信息。Java反射机制提供了以下功能:在运行时判断任意对象的类在运行时构造任意类的对象在运行时判断任意类的成员变量和方法在运行时调用任意对象的方法创建一个新的类对象在运行。在使用Java的反射功能时,必须先获取类的Class对象,再通过Class对象获取其他对象。大家都知道Junit4中的注解@Test代表的是一个测试用例。每个测试用例的本质是测试类中的一个方法,即:@Testpublicvoidtest(){fail("Notyeimplemented");}我们知道,通常,调用一个类的方式是先实例化该类,记录下来作为obj,然后通过obj.test()调用它。这里我们思考一个问题。Junit4是一个框架。在运行过程中,框架并不知道用户定义了多少个测试用例(虽然有@Test约束)。显然,框架只是在运行时确认测试。用例,并以某种方式调用测试用例,这就是反射的本质——在运行时工作!Class类和Class实例我们知道Java中的类是一个模板,它描述了一类对象的行为和状态,如:classPerson{}Personkevin=newPerson();Personmike=newPerson();Person就是类型Kevin和Mike这两个对象的描述,这是对Kevin和Mike这两个对象的描述。Java中万物皆对象,那么Person(自定义类)、String(JDK提供的类)……是什么类型?它们都是Class类的对象,都是用Class类来描述的。什么是类的实例?是类或接口,更严格的说是java中的字节码(类或接口编译后生成的.class文件)。常用API介绍这里重点介绍反射技术中获取Class对象、访问字段、调用方法、调用构造函数等API。获取类的Class对象Class(java.lang.Class)实例表示一个运行中的Java应用程序中的类和接口。这个Class实例是在JVM内部创建的。如果我们查看JDK源码,可以发现Class类的构造方法是私有的。只有JVM可以创建Class实例,而我们自己的Java程序是不能创建Class实例的。由于JVM会为每个加载的类创建一个对应的Class实例,并在实例中保存该类的所有信息,包括类名、包名、父类、实现的接口、所有方法、字段等,如果获取后某个Class实例,我们可以通过这个Class实例获取该实例对应的类的所有信息。获取类的Class对象有多种方式:2.获取类的Fields可以通过反射机制获取某个类的某个属性,然后改变该类实例对应的属性值.JAVA的Class类提供了几种获取类属性的方法。3.获取类的方法通过反射机制获取某个类的某个方法,然后调用该类实例对应的方法。Class类提供了几种获取类的方法。4.获取类的Constructor通过反射机制获取某个类的构造函数,然后调用构造函数创建该类的实例。Class类提供了几种方法来获取类的构造函数。ReflectionAPI应用编写一个类publicclassReflectDemo{ReflectDemo(){System.out.println("Defaultconstructor");}ReflectDemo(Stringp_para){System.out.println("Constructorwithparameters");}publicStringmyPara1="publicAttribute";protectedStringmyPara2="protectedattribute";privateStringmyPara3="privateattribute";publicvoidtest1(){System.out.println("Thisispublicvoidnoparametermethodtest1");}protectedStringtest2(Stringp_test2){System.out.println("这是一个带有参数的protectedvoid方法test2");returnp_test2;}privatevoidtest3(){System.out.println("Thisisaprivatemethodtest3withoutparameters");}}创建一个新的类实例调用该类的Class对象的newInstance方法,该方法会调用对象的默认构造函数。如果没有默认构造函数,调用将失败。代码如下:ClassclassType=ReflectDemo.class;Objectinst=classType.newInstance();System.out.println(inst);调用默认的Constructor对象的newInstance方法,代码如下:ClassclassType=ReflectDemo.class;Constructorconstructor1=classType.getConstructor();Objectinst=constructor1.newInstance();System.out.println(inst);调用参数为Constructor对象的newInstance方法,代码如下:Constructorconstructor2=ReflectDemo.class.getDeclaredConstructor(String.class);Objectinst=constructor2.newInstance("test");System.out.println(inst);调用方法通过反射获取类Method对象,获取类中的所有函数StringclassName="com.lesson.reflect.ReflectDemo";Classclas=Class.forName(className);Method[]a=clas.getDeclaredMethods();for(inti=0;i
