欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

分析那些不講武德的SDK(構(gòu)造使用規(guī)范)

 更新時(shí)間:2023年05月17日 11:08:45   作者:shysh  
這篇文章主要為大家介紹了盤點(diǎn)分析那些不講武德的SDK(構(gòu)造規(guī)范)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

問題發(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)文章

最新評(píng)論