分析那些不講武德的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)文章
Java8 Optional優(yōu)雅空值判斷的示例代碼
這篇文章主要介紹了Java8 Optional優(yōu)雅空值判斷的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05SpringBoot詳解如果通過@Value注解給靜態(tài)變量注入值
這篇文章主要介紹了springboot如何通過@Value給靜態(tài)變量注入值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06IDEA搭建多模塊的Maven項(xiàng)目方式(相互依賴)
這篇文章主要介紹了IDEA搭建多模塊的Maven項(xiàng)目方式(相互依賴),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Springboot項(xiàng)目如何使用apollo配置中心
這篇文章主要介紹了Springboot項(xiàng)目如何使用apollo配置中心,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11利用SpringMVC接收復(fù)雜對(duì)象和多個(gè)文件(前端使用JQuery)
這篇文章主要介紹了利用SpringMVC接收復(fù)雜對(duì)象和多個(gè)文件(前端使用JQuery),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10java實(shí)現(xiàn)fibonacci數(shù)列學(xué)習(xí)示例分享(斐波那契數(shù)列)
這篇文章主要介紹了fibonacci數(shù)列(斐波那契數(shù)列)示例,大家參考使用吧2014-01-01java實(shí)現(xiàn)壓縮字符串和java字符串過濾
這篇文章主要介紹了java實(shí)現(xiàn)壓縮字符串和java字符串過濾,需要的朋友可以參考下2014-04-04