說(shuō)明:如果您有任何疑問(wèn)或想咨詢其他業(yè)務(wù)請(qǐng)撥打電話 400 685 0732
全網(wǎng)監(jiān)測(cè)海量數(shù)據(jù)按需發(fā)布監(jiān)測(cè)預(yù)警
實(shí)時(shí)把握輿情動(dòng)態(tài)精準(zhǔn)追溯信息源頭
在學(xué)習(xí)java的過(guò)程當(dāng)中,我們經(jīng)常會(huì)聽(tīng)見(jiàn)java反射機(jī)制的詞語(yǔ),而java反射機(jī)制又經(jīng)常與JVM相聯(lián)系,那么什么是JVM?java反射機(jī)制又該如何理解呢?今天我們就一起來(lái)好好的了解一下吧。
java反射機(jī)制——什么是JVM
首先我們了解一下JVM,什么是JVM,Java的虛擬機(jī),java之所以能跨平臺(tái)就是因?yàn)檫@個(gè)東西,你可以理解成一個(gè)進(jìn)程,程序,只不過(guò)他的作用是用來(lái)跑你的代碼的。上圖是java的內(nèi)存模型,我們關(guān)注的點(diǎn),一個(gè)方法區(qū),一個(gè)棧,一個(gè)堆,初學(xué)的時(shí)候老師不深入的話只告訴你java的內(nèi)存分為堆和棧。
假如你寫(xiě)了一段代碼:Objecto=new Object();
運(yùn)行了起來(lái)!
首先JVM會(huì)啟動(dòng),你的代碼會(huì)編譯成一個(gè).class文件,然后被類加載器加載進(jìn)jvm的內(nèi)存中,你的類Object加載到方法區(qū)中,創(chuàng)建了Object類的class對(duì)象到堆中,注意這個(gè)不是new出來(lái)的對(duì)象,而是類的類型對(duì)象,每個(gè)類只有一個(gè)class對(duì)象,作為方法區(qū)類的數(shù)據(jù)結(jié)構(gòu)的接口。jvm創(chuàng)建對(duì)象前,會(huì)先檢查類是否加載,尋找類對(duì)應(yīng)的class對(duì)象,若加載好,則為你的對(duì)象分配內(nèi)存,初始化也就是代碼:new Object()。
上面的流程就是你自己寫(xiě)好的代碼扔給jvm去跑,跑完就over了,jvm關(guān)閉,你的程序也停止了。
java反射機(jī)制是什么
反射是什么呢?當(dāng)我們的程序在運(yùn)行時(shí),需要?jiǎng)討B(tài)的加載一些類這些類可能之前用不到所以不用加載到j(luò)vm,而是在運(yùn)行時(shí)根據(jù)需要才加載,這樣的好處對(duì)于服務(wù)器來(lái)說(shuō)不言而喻,舉個(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í)候我們的程序就寫(xiě)得比較動(dòng)態(tài)化,通過(guò)Classtc=Class.forName(“com.java.dbtest.TestConnection”);通過(guò)類的全類名讓jvm在服務(wù)器中找到并加載這個(gè)類,而如果是oracle則傳入的參數(shù)就變成另一個(gè)了。這時(shí)候就可以看到反射的好處了,這個(gè)動(dòng)態(tài)性就體現(xiàn)出java的特性了!舉多個(gè)例子,大家如果接觸過(guò)spring,會(huì)發(fā)現(xiàn)當(dāng)你配置各種各樣的bean時(shí),是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就會(huì)根據(jù)你的需求去動(dòng)態(tài)加載,你的程序就能健壯地運(yùn)行。
有關(guān)java反射機(jī)制的相關(guān)內(nèi)容,今天就介紹到這里了,在學(xué)習(xí)java相關(guān)內(nèi)容時(shí),不要死記硬背,一定要理解,只有徹底的理解這些內(nèi)容你才能夠真正的掌握。如果你還想了解更多與之有關(guān)的內(nèi)容,歡迎關(guān)注我們文軍營(yíng)銷官網(wǎng)。
推薦閱讀
說(shuō)明:如果您有任何疑問(wèn)或想咨詢其他業(yè)務(wù)請(qǐng)撥打電話 400 685 0732