摘要:反射機制一結(jié)合官方通過編寫的反射教程,復(fù)習(xí)一下反射的知識。反射的概念反射是一種在運行時獲取以及修改應(yīng)用行為的一種工具。因為反射需要動態(tài)的解析類的信息,相比于非反射使用的方式要慢。反射需要獲取一定的運行時權(quán)限,在特定的安全環(huán)境下不一定存在。
Java反射機制(一)
結(jié)合Oracle官方通過JDK8編寫的反射教程,復(fù)習(xí)一下反射的知識。結(jié)尾篇補一個小例子。
主要內(nèi)容這次博客的主要內(nèi)容就是簡單介紹反射的概念以及相關(guān)獲取類信息的反射API。
反射的概念反射是一種在運行時獲取以及修改應(yīng)用行為的一種工具。我個人的理解就是,new是一種正向的操作,知道現(xiàn)有系統(tǒng)中會出現(xiàn)什么。反射就是反著來,不知道系統(tǒng)中可能會需要什么樣的類,通過全限定類名的方式,在需要的時候?qū)⑺瓷涑鰜?,同時可以通過反射獲取類的內(nèi)部信息。在Java框架的開發(fā)中,反射技術(shù)運用比較常見。
反射的優(yōu)缺點 優(yōu)點強大的擴展性,用戶可以通過全限定類名的方式去使用外部定義的類。
幫助IDE開發(fā)工具獲取用戶正在開發(fā)的code的信息,提示寫出更正確的代碼。
利于調(diào)試工具獲取運行時信息以及測試類框架的使用比如Junit。
缺點影響性能。 因為反射需要動態(tài)的解析類的信息,相比于非反射使用的方式要慢。
對安全環(huán)境有要求。 反射需要獲取一定的運行時權(quán)限,在特定的安全環(huán)境下不一定存在。
暴露了內(nèi)部的封裝,可能會引起一些負面效果。比如不該被外部調(diào)用的私有方法,通過反射被調(diào)用了。
通過反射獲取類信息Java中除了基本類型就是引用類型。
boolean,int,long,float等就是基本類型
java.lang.String,Java.io.Serializable就是引用類型
對于每一種類型,Java提供了java.lang.Class這個類用于獲取運行時類的屬性和方法信息。同時java.lang.Class也可以用于創(chuàng)建類和對象。
如果是對象類型的話,可以通過其最上層父類Object提供的getClass()方法獲取Class類。
"apple".getClass();
如果是基本類型或者對于一個普通的類來說,可以使用.class的方式來獲取Class類,如下。
int.class; java.io.PrintStream.class;
當(dāng)獲取到類的全限定類名后,可以通過Class.forName創(chuàng)建一個類,如下。
Class c = Class.forName("com.coderising.kailuncen.Main");獲取類的相關(guān)類信息
以下Api可以用于獲取類的相關(guān)類信息。
獲取類的父類信息:
Class.getSuperclass()
獲取類的成員類信息,不包括私有的:
Class.getClasses()
獲取類的所有成員類信息,包括私有的:
Class.getDeclaredClasses()
以下API可以返回聲明了這些成員變量的類的Class信息。
Class.getDeclaringClass() java.lang.reflect.Field.getDeclaringClass() java.lang.reflect.Method.getDeclaringClass() java.lang.reflect.Constructor.getDeclaringClass()
如果這個類是匿名類的話,可以通過如下API獲取包含它的類的類信息。
Class.getEnclosingClass()獲取類的修飾符
類在運行期間可以被多種修飾符修飾,如下所示
訪問限定符: public, protected, and private。
需要override的修飾符:abstract。
然后static,final,Annotations等。
反射API可以使用如下方法去訪問他們。
Class.getModifiers() Class.getAnnotations();獲取類的成員信息
在oracle的教程中,整理了三個表格,介紹了如何獲取類的成員信息。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70714.html
摘要:經(jīng)過前面幾次反射機制的學(xué)習(xí),這次用反射的知識寫一個類似于框架處理機制的小。和在引入反射知識前,先簡單介紹下框架和。再次使用反射獲取的最新值,組成返回,同時根據(jù)方法的返回值,去中獲取對應(yīng)的。最后根據(jù)的返回值和的名稱組成最終展示的視圖。 經(jīng)過前面幾次反射機制的學(xué)習(xí),這次用反射的知識寫一個類似于Struts框架處理機制的小demo。 Servlet 和 Sturts 在引入反射知識前,先簡單...
摘要:反射的本質(zhì)在運行時能夠獲得或判斷某個對象的類型信息有一條前提就是某個對象的類型信息在編譯時必須已知。反射在中用來支持其他特性的,例如對象的序列化和對象對象是進行反射操作的入口所以首先必須獲得對象。 反射的本質(zhì) Java在運行時能夠獲得或判斷某個對象的類型信息 RTTI有一條前提就是某個對象的類型信息在編譯時必須已知。RTTI的實質(zhì)就是編譯器在遍歷檢查代碼時偷偷將類型信息記錄下來并存儲...
摘要:接口與類型信息關(guān)鍵字的一種重要目標(biāo)就是允許程序員隔離構(gòu)件,進而降低耦合性。如果你編寫接口,那么就可以實現(xiàn)這一目標(biāo),但是通過類型信息,這種耦合性還是會傳播出去接口并非是對解耦的一種無懈可擊的保障。 點擊進入我的博客 運行時類型信息使得你可以在運行時發(fā)現(xiàn)和使用類型信息,主要有兩種方式: 傳統(tǒng)的RTTI,它假定我們在編譯時已經(jīng)知道了所有的類型; 反射機制,它允許我們在運行時發(fā)現(xiàn)和使用類的...
摘要:模塊系統(tǒng)的前身是項目。最初,該項目僅僅是為設(shè)計實現(xiàn)一個模塊系統(tǒng)。隨著項目的不斷深入,平臺對標(biāo)準(zhǔn)模塊系統(tǒng)的呼求也日益增長,批準(zhǔn)該項目升級為平臺的一部分,也能服務(wù)于和平臺的需求。自定義的配置,僅包含一組指定的模塊及其所需的模塊。 我的博客 轉(zhuǎn)載請注明原創(chuàng)出處。 序 從Java 9開始,在Java的世界里多了一個叫模塊(JSR376)的特性。模塊系統(tǒng)的前身是Jigsaw項目。最初,該項目僅...
閱讀 2756·2021-10-09 09:44
閱讀 3561·2019-08-30 15:54
閱讀 2171·2019-08-30 14:16
閱讀 2803·2019-08-30 13:09
閱讀 835·2019-08-30 13:08
閱讀 1295·2019-08-29 16:29
閱讀 1681·2019-08-26 13:57
閱讀 1938·2019-08-26 13:53