Java培訓(xùn)教程:Java反射教程實(shí)例講解

Java培訓(xùn)教程:Java反射教程實(shí)例講解

長沙中公優(yōu)就業(yè)      2022-04-28 20:56:01     5

Java培訓(xùn)教程:Java反射教程實(shí)例講解,  什么是反射?它的應(yīng)用場景是什么?  反射(Reflection)是Java 程序開發(fā)語言的特征之一,它允許運(yùn)行中的 Java 程序獲取自身的

課程價(jià)格 請咨詢

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹


  什么是反射?它的應(yīng)用場景是什么?


  反射(Reflection)是Java 程序開發(fā)語言的特征之一,它允許運(yùn)行中的 Java 程序獲取自身的信息,并且可以操作類或?qū)ο蟮膬?nèi)部屬性。

  重點(diǎn):是運(yùn)行時(shí)而不是編譯時(shí)


  “反射”既然有“反”那么肯定有“正”,那么我們首先看一下正的一面



  假如你寫了一段代碼:Object o=new Object();


  運(yùn)行了起來!


  首先JVM會(huì)啟動(dòng),你的代碼會(huì)編譯成一個(gè).class文件,然后被類加載器加載進(jìn)jvm的內(nèi)存中,你的類Object加載到方法區(qū)中,創(chuàng)建了Object類的class對象到堆中,注意這個(gè)不是new出來的對象,而是類的類型對象,每個(gè)類只有一個(gè)class對象,作為方法區(qū)類的數(shù)據(jù)結(jié)構(gòu)的接口。jvm創(chuàng)建對象前,會(huì)先檢查類是否加載,尋找類對應(yīng)的class對象,若加載好,則為你的對象分配內(nèi)存,初始化也就是代碼:new Object()。


  上面的流程就是你自己寫好的代碼扔給jvm去跑,跑完就over了,jvm關(guān)閉,你的程序也停止了。


  上面的程序?qū)ο笫亲约簄ew的,程序相當(dāng)于寫死了給jvm去跑。假如一個(gè)服務(wù)器上突然遇到某個(gè)請求哦要用到某個(gè)類,哎呀但沒加載進(jìn)jvm,是不是要停下來自己寫段代碼,new一下,哦啟動(dòng)一下服務(wù)器,(腦殘)!


  反射是什么呢?


  當(dāng)我們的程序在運(yùn)行時(shí),需要?jiǎng)討B(tài)的加載一些類這些類可能之前用不到所以不用加載到j(luò)vm,而是在運(yùn)行時(shí)根據(jù)需要才加載,這樣的好處對于服務(wù)器來說不言而喻,舉個(gè)例子我們的項(xiàng)目底層有時(shí)是用mysql,有時(shí)用oracle,需要?jiǎng)討B(tài)地根據(jù)實(shí)際情況加載驅(qū)動(dòng)類,這個(gè)時(shí)候反射就有用了,假設(shè) com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection這兩個(gè)類我們要用,這時(shí)候我們的程序就寫得比較動(dòng)態(tài)化,通過Class tc = Class.forName("com.java.dbtest.TestConnection");通過類的全類名讓jvm在服務(wù)器中找到并加載這個(gè)類,而如果是oracle則傳入的參數(shù)就變成另一個(gè)了。這時(shí)候就可以看到反射的好處了,這個(gè)動(dòng)態(tài)性就體現(xiàn)出java的特性了!


  在spring框架中,會(huì)發(fā)現(xiàn)當(dāng)你配置各種各樣的bean時(shí),是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就會(huì)根據(jù)你的需求去動(dòng)態(tài)加載,你的程序就能健壯地運(yùn)行。


  對與框架開發(fā)人員來說,反射雖小但作用非常大,它是各種容器實(shí)現(xiàn)的核心。而對于一般的開發(fā)者來說,不深入框架開發(fā)則用反射用的就會(huì)少一點(diǎn),不過了解一下框架的底層機(jī)制有助于豐富自己的編程思想,也是很有益的。


  知識(shí)剖析:


  java反射機(jī)制提供了以下幾個(gè)功能:


  在運(yùn)行時(shí)判斷任意一個(gè)對象所屬的類;


  在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對象;


  在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法;


  在運(yùn)行時(shí)調(diào)用任意一個(gè)對象的方法。


  反射涉及到四個(gè)核心類:


  java.lang.Class.java:類對象;


  java.lang.reflect.Constructor.java:類的構(gòu)造器對象;


  java.lang.reflect.Method.java:類的方法對象;


  java.lang.reflect.Field.java:類的屬性對象;


  反射工作原理


  反射的工作原理就是借助Class.java、Constructor.java、Method.java、Field.java這四個(gè)類在程序運(yùn)行時(shí)動(dòng)態(tài)訪問和修改任何類的行為和狀態(tài)。


  代碼實(shí)現(xiàn):


  常見問題:


  反射的特點(diǎn)


  優(yōu)點(diǎn)


  靈活、自由度高:不受類的訪問權(quán)限限制,想對類做啥就做啥;


  缺點(diǎn)


  性能問題:通過反射訪問、修改類的屬性和方法時(shí)會(huì)遠(yuǎn)慢于直接操作,但性能問題的嚴(yán)重程度取決于在程序中是如何使用反射的。如果使用得很少,不是很頻繁,性能將不會(huì)是什么問題;


  安全性問題:反射可以隨意訪問和修改類的所有狀態(tài)和行為,破壞了類的封裝性,如果不熟悉被反射類的實(shí)現(xiàn)原理,隨意修改可能導(dǎo)致潛在的邏輯問題;


  兼容性問題:因?yàn)榉瓷鋾?huì)涉及到直接訪問類的方法名和實(shí)例名,不同版本的API如果有變動(dòng),反射時(shí)找不到對應(yīng)的屬性和方法時(shí)會(huì)報(bào)異常;


  如何避免反射導(dǎo)致的性能問題?


  過多地使用反射,的確會(huì)存在性能問題,但如果使用得當(dāng),所謂反射導(dǎo)致性能問題也就不是問題了,關(guān)于反射對性能的影響,參照下面的使用原則,并不會(huì)有什么明顯的問題:


  不要過于頻繁地使用反射,大量地使用反射會(huì)帶來性能問題;


  通過反射直接訪問實(shí)例會(huì)比訪問方法快很多,所以應(yīng)該優(yōu)先采用訪問實(shí)例的方式。



       以上就是長沙中公優(yōu)就業(yè)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java培訓(xùn)教程:Java反射教程實(shí)例講解”的內(nèi)容,希望對大家有幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。


  相關(guān)內(nèi)容


  java核心技術(shù)基礎(chǔ)知識(shí)


  Java內(nèi)部類及反射類面試題


  Java培訓(xùn)教程:Java反射機(jī)制教程


  Java反射機(jī)制的用途和缺點(diǎn)


Java培訓(xùn) Java培訓(xùn)教程 Java教程

培訓(xùn)啦提醒您:交易時(shí)請核實(shí)對方資質(zhì),對于過大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。