【Java基礎】RTTI與反射之Java

來源:互聯網
上載者:User

標籤:協助   time   過程   string類   基礎   const   field   ref   例子   

一、引言 

  很多時候我們的程式可能需要在運行時識別對象和類的資訊,比如多態就是基於運行時環境進行動態判斷實際引用的對象。在運行時識別對象和類的資訊主要有兩種方式:1.RTTI,具體是Class對象,它假定我們在編譯時間已經知道了所有類型。2.反射機制,運行我們在運行時發現和使用類的資訊。

二、RTTI

  RTTI(Run-Time Type Infomation),運行時類型資訊。可以在運行時識別一個對象的類型。類型資訊在運行時通過Class對象表示,Class對象包含與類有關的資訊,可以使用Class對象來建立類的執行個體。

  每個類對應一個Class對象,這個Class對象放在.class檔案中,當我們的程式中首次主動使用某類型時,會把該類型所對應的Class對象載入進記憶體,在這篇文章JVM之類載入器中闡述了哪些情況符合首次主動使用。

  既然RTTI和Class對象有莫大的關係,即有了Class對象,就可以進行很多操作,那麼,我們如何擷取到Class對象呢?有三種方法1. Class.forName("全限定名");(其中,全限定名為包名+類名)。2. 類字面常量,如String.class,對應String類的Class對象。3.通過getClass()方法擷取Class對象,如String str = "abc";str.getClass();。

  通過一個類對應的Class對象後,我們可以做什嗎?我們可以擷取該類的父類、介面、建立該類的對象、該類的構造器、欄位、方法等等。總之,威力相當大。

  下面我們通過一個例子來熟悉Class對象的各種用法。

 View Code

  運行結果: 

 View Code

  說明:使用method1、method2、method3三種方法都可以獲得Class對象,運行結果是等效的。但是三者還是有稍許的區別。區別是從類的初始化角度來看的。如Class.forName("全限定名")會導致類型的載入、連結、初始化過程,而.class則不會初始化該類。顯然,getClass肯定是會初始化該類的,因為這個方法時依託於類的對象。

  下面我們通過一個例子比較.class和forName()兩種方法的區別。

 View Code

  運行結果:

 View Code

  說明:從結果也進一步驗證了.class不會初始化類,而.forName()會初始化類。並且,對常量靜態域的使用也不會導致類的初始化。

三、反射

  與RTTI必須在編譯器就知道所有類型不同,反射不必在編譯期就知道所有的類型,它可以在運行過程中使用動態載入的類,而這個類不必在編譯期就已經知道。反射主要由java.lang.reflect類庫的Field、Method、Constructor類支援。這些類的對象都是JVM在運行時進行建立,用來表示未知的類。

  關於兩者的區別更深刻表達如下:對於RTTI而言,編譯器在編譯時間開啟和檢查.class檔案;對於反射而言,.class檔案在編譯時間是不可擷取的,所以在運行時開啟和檢查.class檔案。

  其實在的第一個例子中我們已經用到了Constructor、Method類,現在我們來更加具體的瞭解Constructor、Method、Field類。  

 View Code

  輸入:boy

  運行結果: 

 View Code

  說明:反射可以讓我們建立一個類的執行個體、在類外部存取類的私人方法、私人欄位。反射真的很強大~

四、動態代理-反射的應用

  動態建立代理並且動態處理對所代理方法的調用。在動態代理上所做的所有調用都會被重新導向到單一的調用處理器上。

  下面是動態代理的例子

 View Code

  運行結果: 

 View Code

  說明:可以在invoke方法中進行過濾操作。過濾出以do開頭的方法進行轉寄。

五、總結

  RTTI和反射分析就到此為止,RTTI和反射確實很強大,可以協助我們幹很多事情,用對地方絕對威力無窮,謝謝各位園友的觀看~

  

【Java基礎】RTTI與反射之Java

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.