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

作者:shysh 时间:2023-05-21 00:36:22 

问题发现

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

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

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

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

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

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

LocalVariableTable结构如下:

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

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

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

  • local_variable_table_length:local_variable_info的个数

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

local_variable_info的结构如下:

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

  • start_pc:局部变量开始的字节码偏移量

  • length:局部变量作用范围的覆盖长度

  • name_index:局部变量名称(CONSTANT_Utf8_info)在常量池中的索引

  • descriptor_index:局部变量的(CONSTANT_Utf8_info)描述在常量池中的索引

  • index:局部变量在栈帧的局部变量表中的Slot的位置,如果数据类型是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方法里面的参数为var1,var2,出现了我们开篇的问题

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

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

javac -g:vars ClassTest.java

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

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

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

javap -v ClassTest

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

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

来源:https://segmentfault.com/a/1190000038913709

标签:SDK,构造,使用规范
0
投稿

猜你喜欢

  • java向文件中追加内容与读写文件内容源码实例代码

    2021-11-15 11:45:13
  • Java中Maven项目导出jar包配置的示例代码

    2023-01-26 20:09:32
  • unity实现贴图矩阵运算(旋转平移缩放)

    2022-07-27 13:53:41
  • Android画画板的制作方法

    2022-08-25 06:08:07
  • 详解Spring 中如何控制2个bean中的初始化顺序

    2023-05-06 13:43:18
  • Android控件之SlidingDrawer(滑动式抽屉)详解与实例分享

    2023-07-27 09:26:18
  • Android 简单实现倒计时功能

    2023-06-27 11:35:40
  • Android实现绘制折线图APP代码

    2022-12-10 07:50:02
  • java字符串替换排序实例

    2023-05-30 07:58:29
  • SpringBoot整合Shiro框架,实现用户权限管理

    2021-10-27 00:03:02
  • C#四舍五入用法实例

    2021-07-20 02:49:20
  • 解决FeignClient重试机制造成的接口幂等性

    2022-01-25 11:10:35
  • java多线程中的异常处理机制简析

    2021-11-18 01:54:39
  • java算法题解牛客BM99顺时针旋转矩阵示例

    2021-07-08 18:55:18
  • Android开发中关于获取当前Activity的一些思考

    2023-07-14 07:35:34
  • Java面向对象基础知识之委托和lambda

    2022-07-28 16:51:11
  • Android webView加载数据时内存溢出问题及解决

    2021-06-24 13:19:28
  • java导出大批量(百万以上)数据的excel文件

    2023-11-16 13:13:22
  • Android ListView实现仿iPhone实现左滑删除按钮的简单实例

    2023-06-15 04:25:59
  • Java之Rsync并发迁移数据并校验详解

    2023-07-17 23:01:22
  • asp之家 软件编程 m.aspxhome.com