分析那些不讲武德的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源码中定义的变量之间的关系,
关于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
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属性中。
来源:https://segmentfault.com/a/1190000038913709


猜你喜欢
- 一、实现对ScrollViewer样式的自定义主要包括:1、滚动条宽度设置2、滚动条颜色3、滚动条圆角4、滚动条拉动时的效果mouseove
- Android 自定义 Toast 显示时间实现代码:package com.wm.realname.util;import android
- 需求场景:当数据库中保存的部分数据需要加密,页面需要正常显示时。这是就需要我们自定义类型转换器,在Mybatis执行SQL得到结果时,通过自
- 首先对于一个SpringBoot工程来说,最明显的标志的就是 @SpringBootApplication它标记了这是一个SpringBoo
- 前言开发中常用到主从数据库来提高系统的性能。怎么样才能方便的实现主从读写分离呢?近日工作任务较轻,有空学习学习技术,遂来研究如果实现读写分离
- 最近项目中有截屏的需求,普通的view截屏方法网上一搜一大把,但是SurfaceView截屏黑屏问题很多文章说的并不清楚,自己参考了一些别的
- 1.介绍我们知道,我们要使一个类型支持foreach循环,就需要这个类型满足下面条件之一:该类型实例如果实现了下列接口中的其中之一:Syst
- 前言最近在改进项目的并发功能,但开发起来磕磕碰碰的。看了好多资料,总算加深了认识。于是打算配合查看源代码,总结并发编程的原理。准备从用得最多
- 多继承指一个子类能同时继承于多个父类,从而同时拥有多个父类的特征,但缺点是显著的。1.若子类继承的父类中拥有相同的成员变量,子类在引用该变量
- Android本地存储SharedPreferences详解存储位置SharedPreferences数据保存在: /data /data/
- 一、ObjectContext对象上下文Entity SQL 语言 - ADO.NET | Microsoft 官当文档ObjectCont
- 今天学习了Mybatis执行存储,感觉不是那么好用,可能是我没用习惯。我先在SQLSERVER创建存储alter procedure usp
- Android 界面刷新 Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,
- 想做一个上传图片的功能,来展示用户上传的图片。在返回给前端的URL上弄了好久,前端一直无法访问到URL,结果一直显示404。 倒腾了一上午发
- 过年微信红包很火,最近有个项目也要做抢红包,于是写了个红包的生成算法。红包生成算法的需求预先生成所有的红包还是一个请求随机生成一个红包简单来
- /** * Gets the number of cores available in this device, across all pr
- 前言跳过废话,直接看正文当年入坑Java是因为它的跨平台优势。那时我认为,”编写一次,处处运行。”这听上去多么牛逼,应该是所有语言发展的终极
- BeanFactory接口:IoC容器的顶级接口,是IoC容器的最基础实现,也是访问Spring容器的根接口,负责对bean的创建,访问等工
- Lambda 表达式Lambda 表达式是现代 C++ 中最重要的特性之一,而 Lambda 表达式,实际上就是提供了一个类似匿名函数的特性
- 大多数的B2C商城项目都会有限时活动,当用户下单后都会有支付超时时间,当订单超时后订单的状态就会自动变成已取消 ,这个功能的实现