最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java反射機(jī)制在Spring IOC中的應(yīng)用詳解

 更新時(shí)間:2021年09月27日 09:56:04   作者:小草mlc  
這篇文章主要介紹了Java反射機(jī)制在Spring IOC中的應(yīng)用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java反射機(jī)制在Spring IOC的應(yīng)用

IOC:即“控制反轉(zhuǎn)”,不是什么技術(shù),而是一種思想。使用IOC意味著將你設(shè)計(jì)好的對(duì)象交給容器控制,而不是傳統(tǒng)的在你的對(duì)象內(nèi)部直接控制。

本篇文章主要講解一下IOC底層實(shí)現(xiàn)的原理(反射),Bean容器的實(shí)現(xiàn),就不對(duì)IOC的概念進(jìn)行詳述了。

在Spring的配置文件中,經(jīng)??吹饺缦屡渲茫?/p>

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

那么通過(guò)這樣配置,Spring是怎么幫我們實(shí)例化對(duì)象,并且放到容器中去了了?對(duì),就是通過(guò)反射?。。?/p>

下面是Spring通過(guò)配置進(jìn)行實(shí)例化對(duì)象

并放到容器中的偽代碼:

//解析<bean .../>元素的id屬性得到該字符串值為“courseDao”
String idStr = "courseDao";
//解析<bean .../>元素的class屬性得到該字符串值為“com.qcjy.learning.Dao.impl.CourseDaoImpl”
String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl";
//利用反射知識(shí),通過(guò)classStr獲取Class類(lèi)對(duì)象
Class<?> cls = Class.forName(classStr);
//實(shí)例化對(duì)象
Object obj = cls.newInstance();
//container表示Spring容器
container.put(idStr, obj);

通過(guò)解析xml文件,獲取到id屬性和class屬性里面的內(nèi)容,利用反射原理獲取到配置里面類(lèi)的實(shí)例對(duì)象,存入到Spring的bean容器中。

當(dāng)一個(gè)類(lèi)里面需要應(yīng)用另一類(lèi)的對(duì)象時(shí),

Spring的配置如下所示

<bean id="courseService" class="com.qcjy.learning.service.impl.CourseServiceImpl">
     <!-- 控制調(diào)用setCourseDao()方法,將容器中的courseDao bean作為傳入?yún)?shù) -->
     <property name="courseDao" ref="courseDao"></property>
</bean>

我們繼續(xù)用偽代碼的形式來(lái)模擬

實(shí)現(xiàn)一下Spring底層處理原理

//解析<property .../>元素的name屬性得到該字符串值為“courseDao”
String nameStr = "courseDao";
//解析<property .../>元素的ref屬性得到該字符串值為“courseDao”
String refStr = "courseDao";
//生成將要調(diào)用setter方法名
String setterName = "set" + nameStr.substring(0, 1).toUpperCase()
  + nameStr.substring(1);
//獲取spring容器中名為refStr的Bean,該Bean將會(huì)作為傳入?yún)?shù)
Object paramBean = container.get(refStr);
//獲取setter方法的Method類(lèi),此處的cls是剛才反射代碼得到的Class對(duì)象
Method setter = cls.getMethod(setterName, paramBean.getClass());
//調(diào)用invoke()方法,此處的obj是剛才反射代碼得到的Object對(duì)象
setter.invoke(obj, paramBean);

通過(guò)上面對(duì)Spring底層原理的分析,可以發(fā)現(xiàn),其實(shí)并不難,用到的都是反射機(jī)制,通過(guò)反射實(shí)例化對(duì)象,存入到Spring的bean容器中。

只要在代碼或配置文件中看到類(lèi)的完整路徑(包.類(lèi)),其底層原理基本上使用的就是Java的反射機(jī)制。

反射機(jī)制、反射機(jī)制的作用、反射機(jī)制的功能

1、反射機(jī)制的作用

  • 通過(guò)java語(yǔ)言中的反射機(jī)制可以i操作字節(jié)碼文件(讀和修改字節(jié)碼文件)
  • 通過(guò)反射機(jī)制可以操作代碼片段(class文件)

2、Java反射機(jī)制的功能

  • 在運(yùn)行時(shí)判斷一個(gè)對(duì)象所屬的類(lèi)
  • 在運(yùn)行時(shí)構(gòu)造一個(gè)類(lèi)的對(duì)象
  • 在運(yùn)行時(shí)判斷一個(gè)類(lèi)所具有成員變量和方法
  • 在運(yùn)行時(shí)調(diào)用一個(gè)對(duì)象的方法

3、反射機(jī)制相關(guān)的重要的類(lèi)有哪些?

  • java.lang.Class : 代表整個(gè)字節(jié)碼,代表一個(gè)類(lèi)型,代表整個(gè)類(lèi)。
  • java.lang.reflect.Method : 代表字節(jié)碼中的方法字節(jié)碼,代表類(lèi)中的方法。
  • java.lang.reflect.Contructor : 代表字節(jié)碼中的構(gòu)造方法字節(jié)碼,代表類(lèi)中的構(gòu)造方法。
  • java.lang.reflect.Field : 代表字節(jié)碼中的屬性字節(jié)碼,代表類(lèi)中的成員變量。

代碼如下(示例):

//java.lang.Class
public class User{
 //Field
 int no;
 
 //Constructor
 public User(){
 }
 
 public User(int no){
  this.no = no;
 }
 
 //Method
 public void setNo(int no){
  this.no = no;
 }
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

浦城县| 呈贡县| 婺源县| 米脂县| 万荣县| 宜黄县| 临沂市| 迭部县| 潍坊市| 平泉县| 临颍县| 盐山县| 杨浦区| 揭东县| 木里| 玉林市| 木里| 金寨县| 伊吾县| 西青区| 雷州市| 沙河市| 巴林左旗| 玉屏| 娄烦县| 天台县| 铜陵市| 文登市| 苍山县| 五原县| 襄汾县| 扶风县| 长沙市| 赤城县| 台江县| 子长县| 罗平县| 松原市| 剑河县| 磐安县| 本溪市|