中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-06-21 21:00:38 來源:網絡 閱讀:557 作者:Android飛魚 欄目:移動開發

前言;

本篇為Android架構師java原理專題二;反射原理及動態代理模式。
大公司面試都要求我們有扎實的Java語言基礎。而很多Android開發朋友這一塊并不是很熟練,甚至半路初級底子很薄,這給我們進階造成了很大的困擾,很容易就碰到瓶頸。如果我們想提升成為高級工程師甚至架構師,java基礎一定要學好。

一.反射(Reflect)

反射之中包含了一個「反」字,所以了解反射我們先從「正」開始。

一般情況下,我們使用某個類時必定知道它是什么類,是用來做什么的。于是我們直接對這個類進行實例化,之后使用這個類對象進行操作。

反射則是一開始并不知道我要初始化的類對象是什么,自然也無法使用 new 關鍵字來創建對象了。這時候,我們使用 JDK 提供的反射 API 進行反射調用。反射就是在運行時才知道要操作的類是什么,并且可以在運行時獲取類的完整構造,并調用對應的方法。

Reflection(反射)是Java被視為動態語言的關鍵,反射機制允許程序在執行期借助于Reflection API取得任何類的內部信息,并能直接操作任意對象的內部屬性及方法。

Java反射機制主要提供了以下功能:

  • 在運行時構造任意一個類的對象

  • 在運行時獲取任意一個類所具有的成員變量和方法

  • 在運行時調用任意一個對象的方法(屬性)

Java 是一門面向對象的語言。在面向對象的世界里,萬事萬物皆對象,既然萬事萬物皆對象,那么我們的類是不是對象呢?

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

里面都保存了些什么?大家可以理解保存了類的元數據信息,一個類的元數據信息包括什么?有哪些屬性,方法,構造器,實現了哪些接口等等,那么這些信息在Java里都有對應的類來表示。

Class類

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

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

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

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

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

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


二.動態代理

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

舉個例子來說明:張三想買某種用品,雖然他可以自己去找,但是這確實太浪費時間和精力了,或者不好意思去買。于是張三就通過中介Mark來買,Mark來幫張三,張三只是負責選擇自己喜歡的的size,然后付錢就可以了。

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

代理模式一般會有三個角色:


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

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

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

代理角色:需要實現抽象角色接口,是真實角色的代理,通過真實角色的業務邏輯方法來實現抽象方法,并可以附加自己的操作。將統一的流程控制都放到代理角色中處理!

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

靜態代理在使用時,需要定義接口或者父類,被代理對象與代理對象一起實現相同的接口或者是繼承相同父類。一般來說,被代理對象和代理對象是一對一的關系,當然一個代理對象對應多個被代理對象也是可以的。

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

三.動態代理

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

優點

只需要1個動態代理類就可以解決創建多個靜態代理的問題,避免重復、多余代碼

更強的靈活性

缺點

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

應用場景局限,因為 Java 的單繼承特性(每個代理類都繼承了 Proxy 類),即只能針對接口 創建 代理類,不能針對類創建代理類。

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

InvocationHandler接口是給動態代理類實現的,負責處理被代理對象的操作的,而Proxy是用來創建動態代理類實例對象的,因為只有得到了這個對象我們才能調用那些需要代理的方法。

四.總結

以上為概念介紹,建議理解概念后再去學習動態代理實現原理,原理詳解視頻也可以分享給大家,有興趣的朋友記得把自己去理解其中原理,并且手寫一下源碼,依靠復制粘貼是永遠不會有大的成長的

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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

景宁| 葵青区| 平凉市| 乌拉特中旗| 丹巴县| 玉山县| 富蕴县| 荣昌县| 舟山市| 农安县| 东源县| 南京市| 儋州市| 双辽市| 通许县| 云南省| 门头沟区| 阜阳市| 灵宝市| 平安县| 泊头市| 乌兰察布市| 怀化市| 新郑市| 垦利县| 辽阳市| 常熟市| 景东| 浦县| 邳州市| 甘洛县| 济宁市| 齐齐哈尔市| 塘沽区| 德昌县| 容城县| 平果县| 哈密市| 辉南县| 大余县| 晋宁县|