Java 反射機(jī)制的實(shí)例詳解
Java 反射機(jī)制的實(shí)例詳解
前言
今天介紹下Java的反射機(jī)制,以前我們獲取一個(gè)類的實(shí)例都是使用new一個(gè)實(shí)例出來(lái)。那樣太low了,今天跟我一起來(lái)學(xué)習(xí)學(xué)習(xí)一種更加高大上的方式來(lái)實(shí)現(xiàn)。
正文
Java反射機(jī)制定義
Java反射機(jī)制是指在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的反射機(jī)制。 用一句話總結(jié)就是反射可以實(shí)現(xiàn)在運(yùn)行時(shí)可以知道任意一個(gè)類的屬性和方法。
反射機(jī)制的優(yōu)點(diǎn)與缺點(diǎn)
為什么要用反射機(jī)制?直接創(chuàng)建對(duì)象不就可以了嗎,這就涉及到了動(dòng)態(tài)與靜態(tài)的概念
靜態(tài)編譯:在編譯時(shí)確定類型,綁定對(duì)象,即通過(guò)。
動(dòng)態(tài)編譯:運(yùn)行時(shí)確定類型,綁定對(duì)象。動(dòng)態(tài)編譯最大限度發(fā)揮了java的靈活性,體現(xiàn)了多態(tài)的應(yīng)用,有以降低類之間的藕合性。
優(yōu)點(diǎn)
可以實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建對(duì)象和編譯,體現(xiàn)出很大的靈活性,特別是在J2EE的開(kāi)發(fā)中它的靈活性就表現(xiàn)的十分明顯。比如,一個(gè)大型的軟件,不可能一次就把把它設(shè)計(jì)的很完美,當(dāng)這個(gè)程序編譯后,發(fā)布了,當(dāng)發(fā)現(xiàn)需要更新某些功能時(shí),我們不可能要用戶把以前的卸載,再重新安裝新的版本,假如這樣的話,這個(gè)軟件肯定是沒(méi)有多少人用的。采用靜態(tài)的話,需要把整個(gè)程序重新編譯一次才可以實(shí)現(xiàn)功能的更新,而采用反射機(jī)制的話,它就可以不用卸載,只需要在運(yùn)行時(shí)才動(dòng)態(tài)的創(chuàng)建和編譯,就可以實(shí)現(xiàn)該功能。
缺點(diǎn)
對(duì)性能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什么并且它滿足我們的要求。這類操作總是慢于只直接執(zhí)行相同的操作。
理解Class類和類類型
想要了解反射首先理解一下Class類,它是反射實(shí)現(xiàn)的基礎(chǔ)。
類是java.lang.Class類的實(shí)例對(duì)象,而Class是所有類的類(There is a class named Class) 對(duì)于普通的對(duì)象,我們一般都會(huì)這樣創(chuàng)建和表示:
Code code1 = new Code();
上面說(shuō)了,所有的類都是Class的對(duì)象,那么如何表示呢,可不可以通過(guò)如下方式呢:
Class c = new Class();
但是我們查看Class的源碼時(shí),是這樣寫(xiě)的:
private Class(ClassLoader loader) { classLoader = loader; }
可以看到構(gòu)造器是私有的,只有JVM可以創(chuàng)建Class的對(duì)象,因此不可以像普通類一樣new一個(gè)Class對(duì)象,雖然我們不能new一個(gè)Class對(duì)象,但是卻可以通過(guò)已有的類得到一個(gè)Class對(duì)象,共有三種方式,如下:
Class c1 = Code.class;
這說(shuō)明任何一個(gè)類都有一個(gè)隱含的靜態(tài)成員變量class,這種方式是通過(guò)獲取類的靜態(tài)成員變量class得到的
Class c2 = code1.getClass();
code1是Code的一個(gè)對(duì)象,這種方式是通過(guò)一個(gè)類的對(duì)象的getClass()方法獲得的
Class c3 = Class.forName(“com.trigl.reflect.Code”);
這種方法是Class類調(diào)用forName方法,通過(guò)一個(gè)類的全量限定名獲得 ,這里,c1、c2、c3都是Class的對(duì)象,他們是完全一樣的,而且有個(gè)學(xué)名,叫做Code的類類型(class type)。 這里就讓人奇怪了,前面不是說(shuō)Code是Class的對(duì)象嗎,而c1、c2、c3也是Class的對(duì)象,那么Code和c1、c2、c3不就一樣了嗎?為什么還叫Code什么類類型?這里不要糾結(jié)于它們是否相同,只要理解類類型是干什么的就好了,顧名思義,類類型就是類的類型,也就是描述一個(gè)類是什么,都有哪些東西,所以我們可以通過(guò)類類型知道一個(gè)類的屬性和方法,并且可以調(diào)用一個(gè)類的屬性和方法,這就是反射的基礎(chǔ)。
舉個(gè)簡(jiǎn)單例子代碼:
public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException { //第一種:Class c1 = Code.class; Class class1=ReflectDemo.class; System.out.println(class1.getName()); //第二種:Class c2 = code1.getClass(); ReflectDemo demo2= new ReflectDemo(); Class c2 = demo2.getClass(); System.out.println(c2.getName()); //第三種:Class c3 = Class.forName("com.trigl.reflect.Code"); Class class3 = Class.forName("com.tengj.reflect.ReflectDemo"); System.out.println(class3.getName()); } }
執(zhí)行結(jié)果:
com.tengj.reflect.ReflectDemo com.tengj.reflect.ReflectDemo com.tengj.reflect.ReflectDemo
Java反射相關(guān)操作
前面我們知道了怎么獲取Class,那么我們可以通過(guò)這個(gè)Class干什么呢?
總結(jié)如下:
獲取成員方法Method
獲取成員變量Field
獲取構(gòu)造函數(shù)Constructor
下面來(lái)具體介紹
獲取成員方法信息
單獨(dú)獲取某一個(gè)方法是通過(guò)Class類的以下方法獲得的:
public Method getDeclaredMethod(String name, Class c){ }
如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
關(guān)于Linux服務(wù)器配置java環(huán)境遇到的問(wèn)題小結(jié)
這篇文章主要介紹了關(guān)于Linux服務(wù)器配置java環(huán)境遇到的問(wèn)題小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12SpringBoot之那些注入不了的Spring占位符(${}表達(dá)式)問(wèn)題
這篇文章主要介紹了SpringBoot之那些注入不了的Spring占位符(${}表達(dá)式)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04解決@Scheduled定時(shí)器使用@Thransactional事物問(wèn)題
這篇文章主要介紹了解決@Scheduled定時(shí)器使用@Thransactional事物問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Spring MVC多種情況下進(jìn)行文件上傳的實(shí)例
上傳是Web工程中很常見(jiàn)的功能,SpringMVC框架簡(jiǎn)化了文件上傳的代碼,本文給大家總結(jié)了Spring MVC多種情況下進(jìn)行文件上傳的實(shí)例,并通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02Java實(shí)現(xiàn)二維數(shù)組和稀疏數(shù)組之間的轉(zhuǎn)換
本文主要介紹了Java 二維數(shù)組和稀疏數(shù)組轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06ssm框架下web項(xiàng)目,web.xml配置文件的作用(詳解)
下面小編就為大家?guī)?lái)一篇ssm框架下web項(xiàng)目,web.xml配置文件的作用(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10