java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SDK构造规范

分析那些不讲武德的SDK(构造使用规范)

作者:shysh

这篇文章主要为大家介绍了盘点分析那些不讲武德的SDK(构造规范)详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

问题发现

今天发生了一件事,令我非常郁闷,就是我在使用一个SDK时,当我调用他的方法时,提示我方法中的参数var1, var2如下:

// 方法是我随意构造的,不代表真实方法
excuseMe(String var1, String var2);

当时我就想对提供SDK的这位仁兄说一句,年轻人不讲武德,我劝你耗子尾汁。

对于这样的API,真的我是看都不想看,你给我整个var0,var1我哪知道这参数到底代表啥,难道我们之间还有摩斯密码,我需要去解密一下,兄台大家都是开发,何苦自相残杀。

既然我已经受到了这段代码的困扰,那么不如我们研究一下为什么会有这种情况发生。

这种情况发生的原因其实是因为Class文件中方法表的Code属性中有一个属性没生成,这个属性是LocalVariableTable

LocalVariableTable结构如下:

LocalVariableTable用来描述栈帧中的局部变量表的变量和与Java源码中定义的变量之间的关系,

关于attribute_name_index和attribute_length的含义如果还有不懂的读者可以建议将我之前讲解的Class文件相关文章阅读一下。

local_variable_info的结构如下:

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方法里面的参数为var1,var2,出现了我们开篇的问题

那么我们怎么解决这个问题,其实只需要在编译的时候加入一个参数-g:vars

javac -g:vars ClassTest.java

可以看出加入这个参数后,Class文件中的变量已经具有含义了from,to

我们再通过一下命令看一下LocalVariableTable这个属性有没有生成

javap -v ClassTest

可以看到LocalVariableTable属性已经生成到excuseMe方法的Code属性中。

以上就是分析那些不讲武德的SDK(构造规范)盘点解析的详细内容,更多关于SDK构造规范的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文