分析那些不講武德的SDK(構(gòu)造使用規(guī)范)
問題發(fā)現(xiàn)
今天發(fā)生了一件事,令我非常郁悶,就是我在使用一個(gè)SDK時(shí),當(dāng)我調(diào)用他的方法時(shí),提示我方法中的參數(shù)var1, var2如下:
// 方法是我隨意構(gòu)造的,不代表真實(shí)方法 excuseMe(String var1, String var2);
當(dāng)時(shí)我就想對(duì)提供SDK的這位仁兄說一句,年輕人不講武德,我勸你耗子尾汁。
對(duì)于這樣的API,真的我是看都不想看,你給我整個(gè)var0,var1我哪知道這參數(shù)到底代表啥,難道我們之間還有摩斯密碼,我需要去解密一下,兄臺(tái)大家都是開發(fā),何苦自相殘殺。
既然我已經(jīng)受到了這段代碼的困擾,那么不如我們研究一下為什么會(huì)有這種情況發(fā)生。
這種情況發(fā)生的原因其實(shí)是因?yàn)镃lass文件中方法表的Code屬性中有一個(gè)屬性沒生成,這個(gè)屬性是LocalVariableTable。
LocalVariableTable結(jié)構(gòu)如下:
LocalVariableTable用來描述棧幀中的局部變量表的變量和與Java源碼中定義的變量之間的關(guān)系,

關(guān)于attribute_name_index和attribute_length的含義如果還有不懂的讀者可以建議將我之前講解的Class文件相關(guān)文章閱讀一下。
- local_variable_table_length:local_variable_info的個(gè)數(shù)
- local_variable_info:一個(gè)棧幀與源碼中的局部變量的關(guān)聯(lián)關(guān)系
local_variable_info的結(jié)構(gòu)如下:

- start_pc:局部變量開始的字節(jié)碼偏移量
- length:局部變量作用范圍的覆蓋長(zhǎng)度
- name_index:局部變量名稱(CONSTANT_Utf8_info)在常量池中的索引
- descriptor_index:局部變量的(CONSTANT_Utf8_info)描述在常量池中的索引
- index:局部變量在棧幀的局部變量表中的Slot的位置,如果數(shù)據(jù)類型是64位,那么他所占用的Slot是index和index+1
public class ClassTest {
private Integer number;
public void excuseMe(String from, String to) {
number = 1;
System.out.println("excuse me");
}
}我們可以通過上述這段代碼來研究一下我們開篇的問題:
javac ClassTest.java
開篇的問題
我們看一下編譯出來的Class文件,execuseMe方法里面的參數(shù)為var1,var2,出現(xiàn)了我們開篇的問題

那么我們?cè)趺唇鉀Q這個(gè)問題,其實(shí)只需要在編譯的時(shí)候加入一個(gè)參數(shù)-g:vars
javac -g:vars ClassTest.java
可以看出加入這個(gè)參數(shù)后,Class文件中的變量已經(jīng)具有含義了from,to

我們?cè)偻ㄟ^一下命令看一下LocalVariableTable這個(gè)屬性有沒有生成
javap -v ClassTest
可以看到LocalVariableTable屬性已經(jīng)生成到excuseMe方法的Code屬性中。

以上就是分析那些不講武德的SDK(構(gòu)造規(guī)范)盤點(diǎn)解析的詳細(xì)內(nèi)容,更多關(guān)于SDK構(gòu)造規(guī)范的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Red?Hat?安裝JDK與IntelliJ?IDEA的詳細(xì)過程
YUM是基于Red Hat的Linux發(fā)行版的一個(gè)強(qiáng)大而用戶友好的包管理工具,這篇文章主要介紹了Red?Hat安裝JDK與IntelliJ IDEA,需要的朋友可以參考下2023-08-08
SpringAOP如何修改請(qǐng)求參數(shù)列表
這篇文章主要介紹了SpringAOP如何修改請(qǐng)求參數(shù)列表問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
java的Builder原理和實(shí)現(xiàn)詳解
大家好,本篇文章主要講的是java的Builder原理和實(shí)現(xiàn)詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
SpringBoot自定義FailureAnalyzer詳解
這篇文章主要介紹了SpringBoot自定義FailureAnalyzer詳解,FailureAnalyzer是一種在啟動(dòng)時(shí)攔截?exception?并將其轉(zhuǎn)換為?human-readable?消息的好方法,包含在故障分析中,需要的朋友可以參考下2023-11-11
Eclipse中創(chuàng)建Web項(xiàng)目最新方法(2023年)
在Java開發(fā)人員中,最常用的開發(fā)工具應(yīng)該就是Eclipse,下面這篇文章主要給大家介紹了關(guān)于Eclipse中創(chuàng)建Web項(xiàng)目2023年最新的方法,需要的朋友可以參考下2023-09-09

