Java反射機制在Spring IOC的應用
IOC:即“控制反轉”,不是什么技術,而是一種思想。使用IOC意味著將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。
本篇文章主要講解一下IOC底層實現的原理(反射),Bean容器的實現,就不對IOC的概念進行詳述了。
在Spring的配置文件中,經??吹饺缦屡渲茫?/p>
1
|
< bean id = "courseDao" class = "com.qcjy.learning.Dao.impl.CourseDaoImpl" ></ bean > |
那么通過這樣配置,Spring是怎么幫我們實例化對象,并且放到容器中去了了?對,就是通過反射?。。?/p>
下面是Spring通過配置進行實例化對象
并放到容器中的偽代碼:
1
2
3
4
5
6
7
8
9
10
|
//解析<bean .../>元素的id屬性得到該字符串值為“courseDao” String idStr = "courseDao" ; //解析<bean .../>元素的class屬性得到該字符串值為“com.qcjy.learning.Dao.impl.CourseDaoImpl” String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl" ; //利用反射知識,通過classStr獲取Class類對象 Class<?> cls = Class.forName(classStr); //實例化對象 Object obj = cls.newInstance(); //container表示Spring容器 container.put(idStr, obj); |
通過解析xml文件,獲取到id屬性和class屬性里面的內容,利用反射原理獲取到配置里面類的實例對象,存入到Spring的bean容器中。
當一個類里面需要應用另一類的對象時,
Spring的配置如下所示
1
2
3
4
|
< bean id = "courseService" class = "com.qcjy.learning.service.impl.CourseServiceImpl" > <!-- 控制調用setCourseDao()方法,將容器中的courseDao bean作為傳入參數 --> < property name = "courseDao" ref = "courseDao" ></ property > </ bean > |
我們繼續用偽代碼的形式來模擬
實現一下Spring底層處理原理
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//解析<property .../>元素的name屬性得到該字符串值為“courseDao” String nameStr = "courseDao" ; //解析<property .../>元素的ref屬性得到該字符串值為“courseDao” String refStr = "courseDao" ; //生成將要調用setter方法名 String setterName = "set" + nameStr.substring( 0 , 1 ).toUpperCase() + nameStr.substring( 1 ); //獲取spring容器中名為refStr的Bean,該Bean將會作為傳入參數 Object paramBean = container.get(refStr); //獲取setter方法的Method類,此處的cls是剛才反射代碼得到的Class對象 Method setter = cls.getMethod(setterName, paramBean.getClass()); //調用invoke()方法,此處的obj是剛才反射代碼得到的Object對象 setter.invoke(obj, paramBean); |
通過上面對Spring底層原理的分析,可以發現,其實并不難,用到的都是反射機制,通過反射實例化對象,存入到Spring的bean容器中。
只要在代碼或配置文件中看到類的完整路徑(包.類),其底層原理基本上使用的就是Java的反射機制。
反射機制、反射機制的作用、反射機制的功能
1、反射機制的作用
- 通過java語言中的反射機制可以i操作字節碼文件(讀和修改字節碼文件)
- 通過反射機制可以操作代碼片段(class文件)
2、Java反射機制的功能
- 在運行時判斷一個對象所屬的類
- 在運行時構造一個類的對象
- 在運行時判斷一個類所具有成員變量和方法
- 在運行時調用一個對象的方法
3、反射機制相關的重要的類有哪些?
-
java.lang.Class
: 代表整個字節碼,代表一個類型,代表整個類。 -
java.lang.reflect.Method
: 代表字節碼中的方法字節碼,代表類中的方法。 -
java.lang.reflect.Contructor
: 代表字節碼中的構造方法字節碼,代表類中的構造方法。 -
java.lang.reflect.Field
: 代表字節碼中的屬性字節碼,代表類中的成員變量。
代碼如下(示例):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//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; } } |
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/mlc1218559742/article/details/52774805