【Android架構師java原理詳解】二;反射原理及動態代理模式

前言;

本篇爲Android架構師java原理專題二;反射原理及動態代理模式java


大公司面試都要求咱們有紮實的Java語言基礎。而不少Android開發朋友這一塊並非很熟練,甚至半路初級底子很薄,這給咱們進階形成了很大的困擾,很容易就碰到瓶頸。若是咱們想提高成爲高級工程師甚至架構師,java基礎必定要學好面試

一.反射(Reflect)

反射之中包含了一個「反」字,因此瞭解反射咱們先從「正」開始。性能優化

通常狀況下,咱們使用某個類時一定知道它是什麼類,是用來作什麼的。因而咱們直接對這個類進行實例化,以後使用這個類對象進行操做。markdown

反射則是一開始並不知道我要初始化的類對象是什麼,天然也沒法使用 new 關鍵字來建立對象了。這時候,咱們使用 JDK 提供的反射 API 進行反射調用。反射就是在運行時才知道要操做的類是什麼,而且能夠在運行時獲取類的完整構造,並調用對應的方法。架構

Reflection(反射)是Java被視爲動態語言的關鍵,反射機制容許程序在執行期藉助於Reflection API取得任何類的內部信息,並能直接操做任意對象的內部屬性及方法。oop

Java反射機制主要提供瞭如下功能:性能

  • 在運行時構造任意一個類的對象
  • 在運行時獲取任意一個類所具備的成員變量和方法
  • 在運行時調用任意一個對象的方法(屬性)

Java 是一門面向對象的語言。在面向對象的世界裏,萬事萬物皆對象,既然萬事萬物皆對象,那麼咱們的類是否是對象呢?學習

咱們寫的每個類均可以當作一個對象,是 java.lang.Class 類的對象。每個類對應的Class放在哪裏呢?當咱們寫完一個類的Java文件,編譯成class文件的時候,編譯器都會將這個類的對應的class對象放在class文件的末尾。優化

裏面都保存了些什麼?你們能夠理解保存了類的元數據信息,一個類的元數據信息包括什麼?有哪些屬性,方法,構造器,實現了哪些接口等等,那麼這些信息在Java裏都有對應的類來表示。spa

Class類

Class是一個類,封裝了當前對象所對應的類的信息

一個類中有屬性,方法,構造器等,好比說有一個Person類,一個Order類,一個Book類,這些都是不一樣的類,如今須要一個類,用來描述類,這就是Class,它應該有類名,屬性,方法,構造器等。Class是用來描述類的類。

Class類是一個對象照鏡子的結果,對象能夠看到本身有哪些屬性,方法,構造器,實現了哪些接口等等
對於每一個類而言,JRE 都爲其保留一個不變的 Class 類型的對象。一個 Class 對象包含了特定某個類的有關信息。

對象只能由系統創建對象,一個類(而不是一個對象)在 JVM 中只會有一個Class實例

獲取Class對象的三種方式;
  1.經過類名獲取 類名.class
  2.經過對象獲取 對象名.getClass()
  3.經過全類名獲取 Class.forName(全類名)

二.動態代理

代理模式和靜態代理
代理模式給某一個對象提供一個代理對象,並由代理對象控制對原對象的引用。通俗的來說代理模式就是咱們生活中常見的中介。

舉個例子來講明:張三想買某種用品,雖然他能夠本身去找,可是這確實太浪費時間和精力了,或者很差意思去買。因而張三就經過中介Mark來買,Mark來幫張三,張三隻是負責選擇本身喜歡的的size,而後付錢就能夠了。

目的:
(1)經過引入代理對象的方式來間接訪問目標對象,防止直接訪問目標對象給系統帶來的沒必要要複雜性
(2)經過代理對象對原有的業務加強;

代理模式通常會有三個角色:


抽象角色:指代理角色和真實角色對外提供的公共方法,通常爲一個接口

真實角色:須要實現抽象角色接口,定義了真實角色所要實現的業務邏輯,以便供代理角色調用。也就是真正的業務邏輯在此。

代理角色:須要實現抽象角色接口,是真實角色的代理,經過真實角色的業務邏輯方法來實現抽象方法,並能夠附加本身的操做。將統一的流程控制都放到代理角色中處理!

而訪問者再也不訪問真實角色,而是去訪問代理角色。

靜態代理在使用時,須要定義接口或者父類,被代理對象與代理對象一塊兒實現相同的接口或者是繼承相同父類。通常來講,被代理對象和代理對象是一對一的關係,固然一個代理對象對應多個被代理對象也是能夠的。

靜態代理,一對一則會出現時靜態代理對象量多、代碼量大,從而致使代碼複雜,可維護性差的問題,一對多則代理對象會出現擴展能力差的問題。


三.動態代理

是指在使用時再建立代理類和實例

優勢

只須要1個動態代理類就能夠解決建立多個靜態代理的問題,避免重複、多餘代碼

更強的靈活性

缺點

效率低,相比靜態代理中 直接調用目標對象方法,動態代理則須要先經過Java反射機制 從而 間接調用目標對象方法

應用場景侷限,由於 Java 的單繼承特性(每一個代理類都繼承了 Proxy 類),即只能針對接口 建立 代理類,不能針對類建立代理類。

在java的動態代理機制中,有兩個重要的類或接口,一個是InvocationHandler接口、另外一個則是 Proxy類,這個類和接口是實現咱們動態代理所必須用到的。

InvocationHandler接口是給動態代理類實現的,負責處理被代理對象的操做的,而Proxy是用來建立動態代理類實例對象的,由於只有獲得了這個對象咱們才能調用那些須要代理的方法。

四.總結

以上主要爲概念介紹,建議先理解基礎概念後再去學習原理與實現,原理詳解視頻也能夠分享給你們,有興趣的朋友記得本身去理解其中原理,而且動手去寫源碼,依靠複製粘貼是永遠不會有大的成長的

五.BAT主流Android架構技術大綱+學習路線+全套視頻;

架構技術詳解和學習路線與資料分享都在博客這篇文章裏;《BATJ一線大廠最主流的Android高級架構技術;體系詳解+學習路線》
(包括自定義控件、NDK、架構設計、混合式開發工程師(React native,Weex)、性能優化、完整商業項目開發等)

  • 阿里P8級Android架構師技術腦圖;
  • 全套體系化高級架構視頻;七大主流技術模塊,視頻+源碼+筆記
相關文章
相關標籤/搜索