JAVA反射機(jī)制中g(shù)etClass和class對(duì)比分析
java有兩個(gè)獲得類名的方法getClass()和class(),這兩個(gè)方法看似一樣,實(shí)則不然。這兩個(gè)方法涉及到了java中的反射。
所謂反射,可以理解為在運(yùn)行時(shí)期獲取對(duì)象類型信息的操作。傳統(tǒng)的編程方法要求程序員在編譯階段決定使用的類型,但是在反射的幫助下,編程人員可以動(dòng)態(tài)獲取這些信息,從而編寫更加具有可移植性的代碼。嚴(yán)格地說,反射并非編程語言的特性,因?yàn)樵谌魏我环N語言都可以實(shí)現(xiàn)反射機(jī)制,但是如果編程語言本身支持反射,那么反射的實(shí)現(xiàn)就會(huì)方便很多。
類型類
要知道類型信息在運(yùn)行時(shí)是如何表示的,這是由Class對(duì)象來完成的,它包含了與類有關(guān)的信息。Class對(duì)象就是用來創(chuàng)建所有“常規(guī)”對(duì)象的,Java使用Class對(duì)象來執(zhí)行RTTI,即使你正在執(zhí)行的是類似類型轉(zhuǎn)換這樣的操作。
每個(gè)類都會(huì)產(chǎn)生一個(gè)對(duì)應(yīng)的Class對(duì)象,也就是保存在.class文件。所有類都是在對(duì)其第一次使用時(shí),動(dòng)態(tài)加載到JVM的,當(dāng)程序創(chuàng)建一個(gè)對(duì)類的靜態(tài)成員的引用時(shí),就會(huì)加載這個(gè)類。Class對(duì)象僅在需要的時(shí)候才會(huì)加載,static初始化是在類加載時(shí)進(jìn)行的。
我們知道在Java中一切都是對(duì)象,我們一般所使用的對(duì)象都直接或間接繼承自O(shè)bject類。Object類中包含一個(gè)方法名叫g(shù)etClass,利用這個(gè)方法就可以獲得一個(gè)實(shí)例的類型類。類型類指的是代表一個(gè)類型的類,因?yàn)橐磺薪允菍?duì)象,類型也不例外,在Java使用類型類來表示一個(gè)類型。所有的類型類都是Class類的實(shí)例。
聯(lián)系
一般情況下,getclass()方法和class()方法是等價(jià)的,都可以獲得一個(gè)類型名,例如下面的代碼:
class A{ public void func(){ } } public class Test { public static void main(String[] args) { A a = new A(); System.out.println(a.getClass()+" "+A.class); } }
輸出的結(jié)果為:classAclassA
區(qū)別:
兩者最直接的區(qū)別就是,getClass()是一個(gè)類的實(shí)例所具備的方法,而class()方法是一個(gè)類的方法。
另外getClass()是在運(yùn)行時(shí)才確定的,而class()方法是在編譯時(shí)就確定了。
例如下面的程序:
class A{ public void func(){ } } class B extends A{ } public class Test { public static void main(String[] args) { A a = new A(); B b = new B(); A ab = new B(); System.out.println(a.getClass()+" "+A.class); System.out.println(b.getClass()+" "+B.class); System.out.println(ab.getClass()); ab = a; System.out.println(ab.getClass()); } }
結(jié)果:
class A class A
class B class B
class B
class A
從最后的結(jié)果為class B來看,當(dāng)出現(xiàn)繼承和多態(tài)時(shí),getclass和class方法的確實(shí)有所不同,因?yàn)槭窃谶\(yùn)行時(shí)確定的,所以結(jié)果是ab在運(yùn)行到這一時(shí)刻是所屬的類型。
總結(jié)
以上就是本文關(guān)于JAVA反射機(jī)制中g(shù)etClass和class異同的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
Java反射之Call stack introspection詳解
如有不足之處,歡迎留言指出。
- Java 采用反射獲取class屬性值的實(shí)現(xiàn)代碼
- Java反射學(xué)習(xí) getClass()函數(shù)應(yīng)用
- 簡(jiǎn)單了解JAVA中類、實(shí)例與Class對(duì)象
- Java中通過Class類獲取Class對(duì)象的方法詳解
- 基于Java class對(duì)象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)
- IntelliJ IDEA引入第三方j(luò)ar包或查看Java源碼的時(shí)候報(bào)decompiled.class file bytecode version:52.0(java 8)錯(cuò)誤的解決辦法
- Java反射獲取class對(duì)象方式解析
相關(guān)文章
SpringBoot重啟后,第一次請(qǐng)求接口請(qǐng)求慢的問題及解決
這篇文章主要介紹了SpringBoot重啟后,第一次請(qǐng)求接口請(qǐng)求慢的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05Java遠(yuǎn)程調(diào)用Shell腳本并獲取輸出信息【推薦】
這篇文章主要介紹了Java遠(yuǎn)程調(diào)用Shell腳本并獲取輸出信息,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09Java使用Scala實(shí)現(xiàn)尾遞歸優(yōu)化來解決爆棧問題
Scala?作為一種多范式的編程語言,結(jié)合了面向?qū)ο蠛秃瘮?shù)式編程的特性,在?Scala?中,尾遞歸?是通過編譯器優(yōu)化來防止棧溢出問題的,尾遞歸優(yōu)化是一種特殊的優(yōu)化方式,可以讓遞歸調(diào)用不使用新的棧幀,所以本文介紹了在Java項(xiàng)目中如何使用Scala實(shí)現(xiàn)尾遞歸優(yōu)化來解決爆棧問題2024-10-10JavaWeb實(shí)現(xiàn)文件上傳與下載的方法
這篇文章主要介紹了JavaWeb實(shí)現(xiàn)文件上傳與下載的方法的相關(guān)資料,需要的朋友可以參考下2016-01-01

spring中向一個(gè)單例bean中注入非單例bean的方法詳解