深入理解JAVA虛擬機學習筆記23——類加載的驗證過程

每天進步一點點持寄!

上一篇已經(jīng)學習了加載階段,這一篇我們了解一下驗證的過程娱俺。

我們已經(jīng)知道了稍味,虛擬機加載的是Class字節(jié)碼文件,我們也通過工具查看了文件中存儲的是二進制流荠卷。

下面我們打開一個文件AppTest.class模庐,我們在文件的開頭隨便加入一個字母“f”,如下圖所示油宜。

那么掂碱,我們通過命令行輸入命令“java AppTest”,會出現(xiàn)什么結果呢慎冤?

虛擬機會報一個Class文件格式化錯誤疼燥,這是我們隨便修改的一個,但是如果某些別有用心的人蚁堤,惡意修改了class文件醉者,為了避免對虛擬機造成傷害,虛擬機必須要在確保Class文件的內(nèi)容符合虛擬機的要求規(guī)范披诗。

驗證部分主要包含下面四個階段的驗證:

1. 文件格式的驗證:驗證文件格式是否按照虛擬機的規(guī)范撬即,也就是我們前面class文件結構中的內(nèi)容,比如這是不是一個Class文件(看魔數(shù)呈队,是否位CAFEBABE)剥槐;Java版本是否符合當前虛擬機的范圍(Java可以向下兼容,但是不能處理大于當前版本的程序)等等宪摧。

2. 元數(shù)據(jù)的驗證:對Class文件中的元數(shù)據(jù)進行驗證粒竖,是否存在不符合Java語義的元數(shù)據(jù)信息。

這里有的朋友可能會比較疑惑几于,什么是元數(shù)據(jù)呢蕊苗?一般情況下,一個文件中都數(shù)據(jù)和元數(shù)據(jù)孩革。數(shù)據(jù)指的是實際數(shù)據(jù)岁歉,而元數(shù)據(jù)(Metadata)是用來描述數(shù)據(jù)的數(shù)據(jù)得运。用過Java注解的朋友應該對元數(shù)據(jù)這種叫法并不陌生膝蜈,對應的元注解锅移,其實說的差不多都是一個意思。

舉個例子:比如說我們定義了一個變量 int a = 1饱搏;可以理解成數(shù)據(jù)就是1非剃,而元數(shù)據(jù)就是描述有一個字符串變量“a”,這個“a”的類型是int型的推沸,它的值也是一個int型的1备绽,這就是描述數(shù)據(jù)的數(shù)據(jù),就是元數(shù)據(jù)鬓催。

3. 字節(jié)碼的驗證:通過數(shù)據(jù)流和控制流分析肺素,來確定程序語義是否合法。

以數(shù)據(jù)來說宇驾,要保證類型轉(zhuǎn)換是有效的倍靡;對于控制流程的代碼,不能讓指令跳轉(zhuǎn)到其它方法的字節(jié)碼指令上等……

4. 符號引用的驗證:為了保證解析動作能正常完成课舍,還需在虛擬機將符號引用轉(zhuǎn)成直接引用的時候塌西,判斷其它要引用的類是否符合規(guī)定。比如筝尾,要引用的類是否能夠被找到捡需;引用的屬性在對應類中是否存在鲸伴,權限是否符合要求(private的是不能訪問的)等战得。

最后再說一點,驗證階段不是必須的兑巾,如果代碼運行已經(jīng)穩(wěn)定了之后贸街,可以通過設置參數(shù)-Xverfy:none參數(shù)來關閉類驗證庵寞,減少虛擬機的類加載時間,提高運行效率薛匪。

既然說到了驗證捐川,不知道朋友們有沒有想到另一個問題,那就是混淆逸尖。

有很多時候古沥,為了使我們的代碼不被反編譯出來,我們會對程序的關鍵部分進行加密處理娇跟,讓文件不容易被反編譯出來岩齿,混淆技術應用而生。

這里就簡單的給朋友們介紹一個工具——ProGuard苞俘,想要使用的朋友可以自行搜索查看盹沈,這里需要注意的是,混淆工具并不是百分百好用吃谣,有些涉及到反射的類是不能使用混淆工具的乞封,否則會出現(xiàn)問題做裙。

喜歡文章或想一起學習的朋友可以關注我,給我點贊肃晚,我將會持續(xù)更新锚贱,有什么疑問或文中有不當之處請給我留言,真誠地希望能與大家一起交流探討关串,學習進步拧廊。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市晋修,隨后出現(xiàn)的幾起案子吧碾,更是在濱河造成了極大的恐慌,老刑警劉巖墓卦,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滤港,死亡現(xiàn)場離奇詭異,居然都是意外死亡趴拧,警方通過查閱死者的電腦和手機溅漾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來著榴,“玉大人添履,你說我怎么就攤上這事∧杂郑” “怎么了暮胧?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長问麸。 經(jīng)常有香客問我往衷,道長,這世上最難降的妖魔是什么严卖? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任席舍,我火速辦了婚禮,結果婚禮上哮笆,老公的妹妹穿的比我還像新娘来颤。我一直安慰自己,他們只是感情好稠肘,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布福铅。 她就那樣靜靜地躺著,像睡著了一般项阴。 火紅的嫁衣襯著肌膚如雪滑黔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音略荡,去河邊找鬼色查。 笑死,一個胖子當著我的面吹牛撞芍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跨扮,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼序无,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衡创?” 一聲冷哼從身側(cè)響起帝嗡,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎璃氢,沒想到半個月后哟玷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡一也,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年巢寡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椰苟。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡抑月,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舆蝴,到底是詐尸還是另有隱情谦絮,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布洁仗,位于F島的核電站层皱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赠潦。R本人自食惡果不足惜叫胖,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望她奥。 院中可真熱鬧臭家,春花似錦、人聲如沸方淤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽携茂。三九已至你踩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背带膜。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工吩谦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膝藕。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓式廷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芭挽。 傳聞我的和親對象是個殘疾皇子滑废,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

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