一、反射用于动态类加载



反射: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中配置并在服务器启动后动态创建。



友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信