JAVA 隱藏類(lèi)(Hidden Classes)

簡(jiǎn)介

來(lái)自JEP371
隱藏類(lèi)劝贸,其他類(lèi)的字節(jié)碼不能直接使用的類(lèi)映九。隱藏類(lèi)適用于在運(yùn)行時(shí)生成類(lèi)并通過(guò)反射間接使用它們件甥。隱藏類(lèi)可以定義為訪(fǎng)問(wèn)控制嵌套的成員哼拔,并且可以獨(dú)立于其他類(lèi)進(jìn)行卸載。

原因

近幾年譬正,產(chǎn)生很多基于jvm的動(dòng)態(tài)語(yǔ)言曾我,例如groovy健民,kotlin等秉犹,基本都是基于動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)動(dòng)態(tài)語(yǔ)言的功能的,而像lambda表達(dá)式型诚,也是在運(yùn)行過(guò)程中傳輸一個(gè)字節(jié)碼,而該字節(jié)碼可以動(dòng)態(tài)生成一個(gè)類(lèi)并且實(shí)例化幸逆。

這樣就會(huì)在程序執(zhí)行的過(guò)程中產(chǎn)生很多的類(lèi),二基于傳統(tǒng)關(guān)于定于標(biāo)準(zhǔn)java類(lèi)的api上看(ClassLoader::defineClassLookup::defineClass)這些動(dòng)態(tài)生成的類(lèi)根本無(wú)法被識(shí)別出來(lái)楚昭。這樣這些動(dòng)態(tài)類(lèi)型很容易被發(fā)現(xiàn),并且聲明周期會(huì)變得很長(zhǎng)塘幅。

如果可以從標(biāo)準(zhǔn)API去定義一個(gè)可以隱藏且生命周期有限的類(lèi)电媳,那么肯定能夠提高所有基于jvm的語(yǔ)言的實(shí)現(xiàn)效率庆亡,例如:

  • java.lang.reflect.Proxy可以定義隱藏類(lèi)作為實(shí)現(xiàn)代理接口的代理類(lèi)
  • java.lang.invoke.StringConcatFactory 可以生成隱藏類(lèi)來(lái)保存常量連接方法
  • java.lang.invoke.LambdaMetaFactory 可以生成隱藏的nestmate類(lèi),以保存訪(fǎng)問(wèn)封閉變量的lambda主體
  • JavaScript引擎可以為從JavaScript程序轉(zhuǎn)換的字節(jié)碼生成隱藏類(lèi)拼缝,因?yàn)楫?dāng)引擎不再使用這些類(lèi)時(shí)咧七,這些類(lèi)將被卸載

創(chuàng)建一個(gè)隱藏類(lèi)

  • 普通類(lèi)是通過(guò)調(diào)用創(chuàng)建的ClassLoader::defineClass

  • 隱藏類(lèi)是通過(guò)調(diào)用創(chuàng)建的java.lang.invoke.MethodHandles.Lookup#defineHiddenClass
    具體的用法可以看jdk15中的java.lang.invoke.InnerClassLambdaMetafactory#generateInnerClass

defineHiddenClass(byte[] bytes, boolean initialize, ClassOption... options)有三個(gè)參數(shù)

  • bytes 一個(gè)符合java虛擬機(jī)規(guī)范的字節(jié)碼
  • initialize 如果為true任斋,那么這個(gè)類(lèi)會(huì)被初始化
  • options java類(lèi)的類(lèi)型詳見(jiàn)java.lang.invoke.MethodHandles.Lookup.ClassOption

隱藏類(lèi)的使用

Lookup::defineHiddenClass會(huì)返回一個(gè)Lookup對(duì)象,我們可以調(diào)用Lookup::lookupClass獲取這個(gè)隱藏類(lèi)的類(lèi)型仁卷,隱藏類(lèi)和普通的類(lèi)一樣使用,但是會(huì)有以下四點(diǎn)注意的地方:

  1. Class::getName 返回不是二進(jìn)制名稱(chēng)的字符串

  2. Class::getCanonicalName返回值是null芒帕,表示示隱藏的類(lèi)沒(méi)有全限定名背蟆。(注意,Java語(yǔ)言中的匿名類(lèi)對(duì)象該方法的返回值也是null带膀。)

  3. 在隱藏類(lèi)中聲明的所有字段都是不可修改的垛叨,無(wú)論是使用Field::set還是其他修改字段的方法都會(huì)拋出IllegalAccessException(包括反射設(shè)置accessibleTrue時(shí))

  4. 隱藏類(lèi)對(duì)象不能被 instrumentation agents修改嗽元,也不能被JVM TI agents重新定義或轉(zhuǎn)換敛纲。

調(diào)試中跟蹤隱藏類(lèi)

添加啟動(dòng)參數(shù)

-XX:+UnlockDiagnosticVMOptions
-XX:+ShowHiddenFrames

有三個(gè)api可以獲取隱藏類(lèi)的堆棧信息

Throwable::getStackTrace
Thread::getStackTrace
StackWalkerAPI
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市旁壮,隨后出現(xiàn)的幾起案子谐檀,更是在濱河造成了極大的恐慌,老刑警劉巖童叠,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厦坛,死亡現(xiàn)場(chǎng)離奇詭異杜秸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)撬碟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)呢蛤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)其障,“玉大人励翼,你說(shuō)我怎么就攤上這事∑В” “怎么了造烁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵惭蟋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)与涡,這世上最難降的妖魔是什么惹谐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任氨肌,我火速辦了婚禮怎囚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恳守。我一直安慰自己催烘,他們只是感情好伊群,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布策精。 她就那樣靜靜地躺著咽袜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪及老。 梳的紋絲不亂的頭發(fā)上范抓,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天僧鲁,我揣著相機(jī)與錄音,去河邊找鬼斟叼。 笑死春寿,一個(gè)胖子當(dāng)著我的面吹牛绑改,可吹牛的內(nèi)容都是我干的厘线。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼渡讼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼成箫!你這毒婦竟也來(lái)了旨枯?” 一聲冷哼從身側(cè)響起召廷,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竞慢,沒(méi)想到半個(gè)月后先紫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筹煮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年遮精,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片败潦。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡本冲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出劫扒,到底是詐尸還是另有隱情檬洞,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布沟饥,位于F島的核電站添怔,受9級(jí)特大地震影響湾戳,放射性物質(zhì)發(fā)生泄漏广料。R本人自食惡果不足惜韧衣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一其兴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匀归,春花似錦、人聲如沸体啰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)橘沥。三九已至威恼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斤蔓,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工椭豫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喳整,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像囱淋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子税手,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 3:類(lèi)加載-初始化 1. 加載過(guò)程 1. Loading 1. 雙親委派,主要出于安全來(lái)考慮 2. LazyLoa...
    Yuszha閱讀 480評(píng)論 0 0
  • JVM 1:JVM基礎(chǔ)知識(shí) 什么是JVM 常見(jiàn)的JVM 2:ClassFileFormat 3:類(lèi)編譯-加載-初始...
    皮皮魏閱讀 229評(píng)論 0 0
  • 一,apk以進(jìn)程的形式運(yùn)行穆役,進(jìn)程的創(chuàng)建是由zygote。 參考文章《深入理解Dalvik虛擬機(jī)- Android應(yīng)...
    Kevin_Junbaozi閱讀 2,846評(píng)論 0 12
  • 面試必背 會(huì)舍棄、總結(jié)概括——根據(jù)我這些年面試和看面試題搜集過(guò)來(lái)的知識(shí)點(diǎn)匯總而來(lái) 建議根據(jù)我的寫(xiě)的面試應(yīng)對(duì)思路中的...
    luoyangzk閱讀 6,756評(píng)論 6 173
  • 推薦指數(shù): 6.0 書(shū)籍主旨關(guān)鍵詞:特權(quán)减响、焦點(diǎn)、注意力颂鸿、語(yǔ)言聯(lián)想嘴纺、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析,社會(huì)...
    Jenaral閱讀 5,721評(píng)論 0 5