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

 更新时间:2023年05月17日 11:08:45   作者: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_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属性中。

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

相关文章

  • java判断域名无法访问自行访问下一条

    java判断域名无法访问自行访问下一条

    这篇文章主要为大家介绍了java实现判断域名无法访问的时候自行访问下一条域名示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Spring Boot 添加MySQL数据库及JPA实例

    Spring Boot 添加MySQL数据库及JPA实例

    本篇文章主要介绍了Spring Boot 添加MySQL数据库及JPA,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 一文搞懂Java克隆及深拷贝与浅拷贝的区别

    一文搞懂Java克隆及深拷贝与浅拷贝的区别

    在编程中,通常通过实现Cloneable接口和重写clone方法来实现对象的克隆,然而,需要注意的是克隆操作可能存在深拷贝和浅拷贝的区别,在使用时需要根据实际需求选择合适的克隆方式,本文就给大家详细讲讲什么是克隆以及深拷贝与浅拷贝的区别,需要的朋友可以参考下
    2023-08-08
  • JavaBean valication验证实现方法示例

    JavaBean valication验证实现方法示例

    这篇文章主要介绍了JavaBean valication验证实现方法,结合实例形式分析了JavaBean valication验证相关概念、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-03-03
  • jpa使用uuid策略后无法手动设置id的问题及解决

    jpa使用uuid策略后无法手动设置id的问题及解决

    这篇文章主要介绍了jpa使用uuid策略后无法手动设置id的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Springboot实现ENC加密的详细流程

    Springboot实现ENC加密的详细流程

    在项目开发过程中,需要配置数据库连接密码、Redis密码、网盘上传的AK/SK等敏感信息,都需要保存在配置文件里,或者配置中心,这些信息如果泄露,还是会造成一定的困扰,下面这篇文章主要给大家介绍了关于Springboot实现ENC加密的详细流程,需要的朋友可以参考下
    2023-06-06
  • IDEA去除掉代码中虚线、波浪线和下划线实线的方法

    IDEA去除掉代码中虚线、波浪线和下划线实线的方法

    初次安装使用IDEA,总是能看到导入代码后,出现很多的波浪线,下划线和虚线,这是IDEA给我们的一些提示和警告,但是有时候我们并不需要,反而会让人看着很不爽,这里简单记录一下自己的调整方法,供其他的小伙伴在使用的时候参考
    2024-09-09
  • Java 中synchronize函数的实例详解

    Java 中synchronize函数的实例详解

    这篇文章主要介绍了Java 中synchronize函数的实例详解的相关资料,希望通过本文能帮助到大家理解使用synchronize函数的使用方法,需要的朋友可以参考下
    2017-09-09
  • Spring Boot 整合 Apache Dubbo的示例代码

    Spring Boot 整合 Apache Dubbo的示例代码

    Apache Dubbo是一款高性能、轻量级的开源 Java RPC 框架,这篇文章主要介绍了Spring Boot 整合 Apache Dubbo的方法,本文通过示例说明给大家讲解的非常详细,需要的朋友可以参考下
    2021-07-07
  • 自定义starter引发的线上事故记录复盘

    自定义starter引发的线上事故记录复盘

    这篇文章主要为大家介绍了自定义starter引发的线上事故记录复盘,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论