博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java反射机制在Spring IOC中的应用
阅读量:6083 次
发布时间:2019-06-20

本文共 2242 字,大约阅读时间需要 7 分钟。

反射的定义:

反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取它所有的成员变量和方法并且显示出来。

 

反射机制的优点与缺点

首先要搞清楚为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念。 

静态编译:在编译时确定类型,绑定对象,即通过。 
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。 

反射机制的优点:可以实现动态创建对象和编译,体现出很大的灵活性(特别是在J2EE的开发中它的灵活性就表现的十分明显)。通过反射机制我们可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。

  比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。 

反射机制的缺点:对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它 满足我们的要求。这类操作总是慢于只直接执行相同的操作。

 

IOC:即“控制反转”,不是什么技术,而是一种思想。使用IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

在的配置文件中,经常看到如下配置:

 

[html]   
 
  1. <bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>  

那么通过这样配置,Spring是怎么帮我们实例化对象,并且放到容器中去了了?对,就是通过反射!!!

 

下面是Spring通过配置进行实例化对象,并放到容器中的伪代码:

 

[html]   
 
  1. //解析<bean .../>元素的id属性得到该字符串值为“courseDao”  
  2. String idStr = "courseDao";  
  3. //解析<bean .../>元素的class属性得到该字符串值为“com.qcjy.learning.Dao.impl.CourseDaoImpl”  
  4. String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl";  
  5. //利用反射知识,通过classStr获取Class类对象  
  6. Class<?cls = Class.forName(classStr);  
  7. //实例化对象  
  8. Object obj = cls.newInstance();  
  9. //container表示Spring容器  
  10. container.put(idStr, obj);  

通过解析xml文件,获取到id属性和class属性里面的内容,利用反射原理获取到配置里面类的实例对象,存入到Spring的bean容器中。

 

 

当一个类里面需要应用另一类的对象时,Spring的配置如下所示:

 

[html]   
 
  1. <bean id="courseService" class="com.qcjy.learning.service.impl.CourseServiceImpl">  
  2.      <!-- 控制调用setCourseDao()方法,将容器中的courseDao bean作为传入参数 -->  
  3.      <property name="courseDao" ref="courseDao"></property>  
  4. </bean>  

我们继续用伪代码的形式来模拟实现一下Spring底层处理原理:

 

 

[java]   
 
  1. //解析<property .../>元素的name属性得到该字符串值为“courseDao”  
  2. String nameStr = "courseDao";  
  3. //解析<property .../>元素的ref属性得到该字符串值为“courseDao”  
  4. String refStr = "courseDao";  
  5. //生成将要调用setter方法名  
  6. String setterName = "set" + nameStr.substring(0, 1).toUpperCase()  
  7.         + nameStr.substring(1);  
  8. //获取spring容器中名为refStr的Bean,该Bean将会作为传入参数  
  9. Object paramBean = container.get(refStr);  
  10. //获取setter方法的Method类,此处的cls是刚才反射代码得到的Class对象  
  11. Method setter = cls.getMethod(setterName, paramBean.getClass());  
  12. //调用invoke()方法,此处的obj是刚才反射代码得到的Object对象  
  13. setter.invoke(obj, paramBean);  

 

通过上面对Spring底层原理的分析,可以发现,其实并不难,用到的都是反射机制,通过反射实例化对象,存入到Spring的bean容器中。

只要在代码或配置文件中看到类的完整路径(包.类),其底层原理基本上使用的就是的反射机制。

 

转载地址:http://fzkwa.baihongyu.com/

你可能感兴趣的文章
MapReduce的模式,算法以及用例
查看>>
《Advanced Linux Programming》读书笔记(1)
查看>>
zabbix agent item
查看>>
一步一步学习SignalR进行实时通信_7_非代理
查看>>
AOL重组为两大业务部门 全球裁员500人
查看>>
字符设备与块设备的区别
查看>>
为什么我弃用GNOME转向KDE(2)
查看>>
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>
IntelliJ IDEA解决Tomcal启动报错
查看>>
默认虚拟主机设置
查看>>
php中的短标签 太坑人了
查看>>
[译] 可维护的 ETL:使管道更容易支持和扩展的技巧
查看>>
### 继承 ###
查看>>
数组扩展方法之求和
查看>>
astah-professional-7_2_0安装
查看>>
函数是对象-有属性有方法
查看>>
uva 10107 - What is the Median?
查看>>