反射 和 JAVAssist

問題: java 反射為什么會慢呢? 應(yīng)該如何解決? 當作面試題來問吧。

其實不僅僅是面試題,在RPC框架中,使用javassist invoke method, 而不是選擇反射。最近開dubbo 的源碼時候,就發(fā)現(xiàn)rpc 調(diào)用直接使用javassit

第一步: java 反射 是什么?

java 反射 可以觀測 java正在運行的程序,甚至修改程序的動態(tài)行為。比如說可以通過class對象獲取所有的method和屬性,可以通過Method.setAccessible 繞過java 的訪問權(quán)限。我們?nèi)粘J褂玫腎DE一部分使用java反射的原理,當在鍵盤敲擊點的時候就可以列出所有類的所有的方法。spring框架IoC也是依賴反射機制。但是反射的運行速度是有人會抱怨的。下面先看看反射的API:

使用java 反射的API 首先

(1)獲取class 對象,可以通過Class.forName, getClass, 或者直接.class 訪問。對于數(shù)組的class 對象, 可以通過Class.getComponentType() 方法獲得數(shù)組元素的類型

(2)使用newInstance 獲取class 對象的instance, 通過getFields,getConstructors, getMethods 獲取該類的成員。method.invoke(object, object[])來調(diào)用方法,field.get/set(object)來訪問字段的值

第二步:java 反射和 JVM

java的反射先調(diào)用了 Method.invoke,然后進入委派實現(xiàn) DelegatingMethodAccessorimpl, 再進入本地實現(xiàn)NativeMethodAccessorImpl。java 反射使用委派機制是為了能夠在本地以及動態(tài)實現(xiàn)中切換。動態(tài)實現(xiàn)就是指動態(tài)生成字節(jié)碼的實現(xiàn)。動態(tài)字節(jié)碼生成的運行效率比反射的高。但是生成字節(jié)碼的過程也是耗時的,因此java 虛擬機通過Dsun.reflect.inflationThreashold = 15, 來決定是采用動態(tài)字節(jié)碼生成還是本地運行。其中JAVAssist 就是可以動態(tài)生成 字節(jié)碼。

那么java 反射為什么會慢呢?

(1)class.getMethod, 會遍歷公有方法,如果匹配不到,還會遍歷父類公有方法,在代碼中,我們最好能夠緩存遍歷出來的結(jié)果

(2) method.invoke 是一個變長的參數(shù)方法,最后一個參數(shù)是Object 數(shù)組,Object 數(shù)組不能存儲基本類型,會對傳入的基本類型參數(shù)自動裝箱。java緩存了[-128, 127]中的所有整數(shù)對應(yīng)的Integer 對象,不再這個范圍內(nèi)的,需要新建一個integer對象

最近看dubbo 源代碼,對其dubbo 的spi 設(shè)計, 和 javassist 使用比較感興趣,原來背后都是有原因。是不是很神奇?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 深入理解Class對象 RRTI的概念以及Class對象作用 認識Class對象之前,先來了解一個概念,RTTI(...
    架構(gòu)師springboot閱讀 1,655評論 0 3
  • 整體Retrofit內(nèi)容如下: 1、Retrofit解析1之前哨站——理解RESTful 2、Retrofit解析...
    隔壁老李頭閱讀 4,808評論 2 12
  • 反射是指計算機程序在運行時訪問、檢測和修改它本身狀態(tài)或行為的一種能力,是一種元編程語言特性,有很多語言都提供了對反...
    yhthu閱讀 1,136評論 0 1
  • 初 去往教學樓的一條小道上,有一排紫薇,枝條的末端會開上一簇簇暗紫色的小小的花,落了之后,留下泥黃色的略微脫皮的枝...
    corir閱讀 299評論 0 0
  • 生活70分 本周運動 在每日瑜伽基礎(chǔ)上加上了拜日晨練以及keep20分鐘運動打卡。 但是偶爾會有間斷,比如周五全天...
    Littleolivia閱讀 174評論 0 0

友情鏈接更多精彩內(nèi)容