前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >这样的SDK不讲武德(文末有红包)

这样的SDK不讲武德(文末有红包)

作者头像
shysh95
发布2021-01-18 14:49:18
2500
发布2021-01-18 14:49:18
举报
文章被收录于专栏:shysh95

今天发生了一件事,令我非常郁闷,当时的心情如下图,你品你细品。

我在使用一个三方提供的SDK时,当我调用他的方法时,提示我方法中的参数var1, var2如下:

代码语言:javascript
复制
// 方法是我随意构造的,不代表真实方法
excuseMe(String var1, String var2);

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

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

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

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

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

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

  • local_variable_table_length:local_variable_info的个数
  • local_variable_info:一个栈帧与源码中的局部变量的关联关系

local_variable_info的结构如下:

  • start_pc:局部变量开始的字节码偏移量
  • length:局部变量作用范围的覆盖长度
  • name_index:局部变量名称(CONSTANT_Utf8_info)在常量池中的索引
  • descriptor_index:局部变量的(CONSTANT_Utf8_info)描述在常量池中的索引
  • index:局部变量在栈帧的局部变量表中的Slot的位置,如果数据类型是64位,那么他所占用的Slot是index和index+1
代码语言:javascript
复制
public class ClassTest {

    private Integer number;

    public void excuseMe(String from, String to) {
        number = 1;
        System.out.println("excuse me");
    }

}

我们可以通过上述这段代码来研究一下我们开篇的问题:

代码语言:javascript
复制
javac ClassTest.java

我们看一下编译出来的Class文件,execuseMe方法里面的参数为var1,var2,出现了我们开篇的问题

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

代码语言:javascript
复制
javac -g:vars ClassTest.java

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

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

代码语言:javascript
复制
javap -v ClassTest

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员修炼笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档