一、反射用于动态类加载
反射:java提供的动态执行机制,可以动态的加载类,动态创建对象,动态执行方法。
上图是jvm如何执行Class cls = Class.forName("Foo"),也就是jvm如何将Foo.class文件加载到内存中的——类加载
step1:javac(java编译器)将java文件编译生成*.class文件
step2:jvm在运行过程中,根据class.forName("Foo")中的Foo来找到硬盘中的Foo.class文件(这个过程叫做类加载——classLoad)。加载并放到方法区中,这就是
为何我们在创建类的时候,类名要和文件名相同,不然jvm无法找到*.class文件。
step3:jvm根据Foo.class文件创建一个以cls命名的Class对象。这个对象可以通向方法区,我们可以操作cls来获得Foo类的所有信息。从而动态调用方法,创建对象,访问属性(甚至通过setAccessible来打开属性访问权限)。
二、反射用于spring框架
组件扫描,注解扫描,对象注入,对象创建。
案例:
在Controller组件中,并没有关于Service的set方法以及构造器,那么并不能够用set方法或者直接访问此private属性。那么如何进行注解注入?答案就是反射,调用setAccessible来设置访问权限。
三、Mybatis框架应用
案例:
JavaBean:User 属性private id,private name
mapper.xml中的查询Sql:SELECT ID,NAME FROM CN_USER;
问:mybatis如何将查询到的结果放到User对象的List集合中呢?
答案:mybatis框架通过读取sql,得到字段名称(与属性名相同),并用反射的方式将User对象创建出来,之后调用其set方法进行参数注入。最后放到List中
四、反射在服务器中的应用
DispatcherServlet与Filter的创建,在web.xml中配置并在服务器启动后动态创建。
热门工具 换一换