框架底層的那些不為人知的密碼之Java反射機制

一缝龄、反射的概敘

什么是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框架。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涌攻,一起剝皮案震驚了整個濱河市欧引,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恳谎,老刑警劉巖维咸,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惠爽,居然都是意外死亡癌蓖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門婚肆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來租副,“玉大人,你說我怎么就攤上這事较性∮蒙” “怎么了结胀?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長责循。 經(jīng)常有香客問我糟港,道長,這世上最難降的妖魔是什么院仿? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任秸抚,我火速辦了婚禮,結(jié)果婚禮上歹垫,老公的妹妹穿的比我還像新娘剥汤。我一直安慰自己,他們只是感情好排惨,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布吭敢。 她就那樣靜靜地躺著,像睡著了一般暮芭。 火紅的嫁衣襯著肌膚如雪鹿驼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天辕宏,我揣著相機與錄音畜晰,去河邊找鬼。 笑死匾效,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的恤磷。 我是一名探鬼主播面哼,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扫步!你這毒婦竟也來了魔策?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤河胎,失蹤者是張志新(化名)和其女友劉穎闯袒,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體游岳,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡政敢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胚迫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喷户。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖访锻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仇味,我是刑警寧澤学赛,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站避诽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏璃谨。R本人自食惡果不足惜沙庐,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望睬罗。 院中可真熱鬧轨功,春花似錦、人聲如沸容达。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽花盐。三九已至羡滑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間算芯,已是汗流浹背柒昏。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留熙揍,地道東北人职祷。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像届囚,于是被迫代替她去往敵國和親有梆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容