一缝龄、反射的概敘
什么是Java的反射機制寨闹?
? ? ? ? 反射是Java的特征之一胶坠,是一種間接操作目標對象的機制,核心是JVM在運行的時候才動態(tài)加載類繁堡,并且對于任意一個類沈善,都能夠知道這個類的所有屬性和方法乡数,調(diào)用方法/訪問屬性,不需要提前在編譯期知道運行的對象是誰闻牡,他允許運行中的Java程序獲取類的信息净赴,并且可以操作類或?qū)ο髢?nèi)部屬性。程序中對象的類型一般都是在編譯期就確定下來的罩润,而當我們的程序在運行時玖翅,可能需要動態(tài)的加載一些類,這些類因為之前用不到割以,所以沒有加載到jvm金度,這時,使用Java反射機制可以在運行期動態(tài)的創(chuàng)建對象并調(diào)用其屬性严沥,它是在運行時根據(jù)需要才加載审姓。
Java反射機制的作用?
允許編程人員在對類未知的情況下祝峻,獲取類相關(guān)信息的方式變得更加多樣靈活,調(diào)用類中相應方法扎筒,是Java增加其靈活性與動態(tài)性的一種機制(從.class --> .java)莱找。
反射機制的優(yōu)缺點?
優(yōu)點:
????????使用反射嗜桌,我們就可以在運行時獲得類的各種內(nèi)容奥溺,進行反編譯,對于Java這種先編譯再運行的語言骨宠,能夠讓我們很方便的創(chuàng)建靈活的代碼浮定,這些代碼可以在運行時裝配,無需在組件之間進行源代碼的鏈接层亿,更加容易實現(xiàn)面向?qū)ο蟆?/p>
缺點:
1桦卒、性能問題。
????????Java反射機制中包含了一些動態(tài)類型匿又,所以Java虛擬機不能夠?qū)@些動態(tài)代碼進行優(yōu)化方灾。因此,反射操作的效率要比正常操作效率低很多碌更。我們應該避免在對性能要求很高的程序或經(jīng)常被執(zhí)行的代碼中使用反射裕偿。而且,如何使用反射決定了性能的高低痛单。如果它作為程序中較少運行的部分嘿棘,性能將不會成為一個問題。
2旭绒、安全限制鸟妙。
????????使用反射通常需要程序的運行沒有安全方面的限制焦人。如果一個程序?qū)Π踩蕴岢鲆螅瑒t最好不要使用反射圆仔。
3垃瞧、程序健壯性。
????????反射允許代碼執(zhí)行一些通常不被允許的操作坪郭,所以使用反射有可能會導致意想不到的后果个从。反射代碼破壞了Java程序結(jié)構(gòu)的抽象性,所以當程序運行的平臺發(fā)生變化的時候歪沃,由于抽象的邏輯結(jié)構(gòu)不能被識別嗦锐,代碼產(chǎn)生的效果與之前會產(chǎn)生差異。同時也會使得程序的代碼復雜度上升沪曙,所以還要我們慎重的使用它奕污。
二、反射的基本使用
sun為反射機制提供的常用的類
? ??????Java.lang.Class;?
?? ?????Java.lang.reflect.Constructor;??
? ??????Java.lang.reflect.Field;
? ??????Java.lang.reflect.Method;?
? ??????Java.lang.reflect.Modifier;
反射常用的API液走?
????對象. setAccessible(true);// 修改訪問權(quán)限
Class:
????類對象.getField("屬性名");?? //獲取公開屬性
????類對象.getDeclaredField("屬性名");? //獲取私有屬性
????類對象.getMethod("方法名", null); //通過指定方法名稱獲取公開無參方法對象
????類對象.getMethods(); //獲取所有公開方法對象
????類對象.getDeclaredMethods(); //獲取所有方法對象
????類對象.getDeclaredMethod("方法名", 方法參數(shù)的類型......); //通過指定方法名稱獲取私有有參方法對象
????類對象.getConstructor(構(gòu)造參數(shù)類型); //調(diào)用公開有參構(gòu)造
????類對象.getDeclaredConstructor(構(gòu)造參數(shù)類型); //調(diào)用私有有參構(gòu)造
????類對象.isInstance(obj);// 判斷是否是某個類的實例
Field:
????屬性對象.getName(); //獲取屬性名
????屬性對象.getType(); ////獲取屬性的類型
????屬性對象.getModifiers(); //獲取屬性的修飾符
????屬性對象.set(obj,obj); //設置屬性值 1:類實例化對象 要設置的參數(shù)值
????……
Method:
?????? 方法對象.invoke(類實例化對象, 方法的參數(shù)數(shù)組);? //執(zhí)行方法
Constructor:
?????? NewInstance();//通過構(gòu)造獲取到類的實例對象
三碳默、站在反射的角度看待ORM框架
ORM框架的簡單實現(xiàn)(JDBC部分):
? ? jdbc連接類:
? ? ? ? CRUD基類:
? ? ? ? ? ? 得到增加SQL的方法:
? ??????增加方法:
? ??????查詢方法:
????從以上代碼可以看出我們只需要傳入一個Object對象就可以對數(shù)據(jù)庫進行CRUD操作,Object對象是可以為任意實體類的缘眶,所以說這個類是我們通過反射的機制來寫的一個對所有數(shù)據(jù)庫表CRUD的基類嘱根。
????類似與ORM框架Hibernate、Mybatis框架底層都是使用反射機制來保證框架的靈活性巷懈。我曾閱讀過這些框架的源碼该抒,底層實現(xiàn)幾乎就是使用這樣的方式實現(xiàn)的,只是我這個實現(xiàn)寫的有點簡單顶燕,大家可以參考我的這篇文章再去看一下框架的源碼凑保,試著自己寫一個ORM框架。