zoukankan      html  css  js  c++  java
  • Java 基础

    总结

    javap是jdk自带的反解析工具。它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。

    javap的用法格式:

    javap <options> <classes>
    

    其中classes就是你要反编译的class文件。 在命令行中直接输入javap或javap -help可以看到javap的options有如下选项:

    -help  --help  -?        输出此用法消息
     -version                 版本信息,其实是当前javap所在jdk的版本信息,不是class在哪个jdk下生成的。
     -v  -verbose             输出附加信息(包括行号、本地变量表,反汇编等详细信息)
     -l                         输出行号和本地变量表
     -public                    仅显示公共类和成员
     -protected               显示受保护的/公共类和成员
     -package                 显示程序包/受保护的/公共类 和成员 (默认)
     -p  -private             显示所有类和成员
     -c                       对代码进行反汇编
     -s                       输出内部类型签名
     -sysinfo                 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列)
     -constants               显示静态最终常量
     -classpath <path>        指定查找用户类文件的位置
     -bootclasspath <path>    覆盖引导类文件的位置
    

    一般常用的是-v -l -c三个选项:

    • javap -v classxx,不仅会输出行号、本地变量表信息、反编译汇编代码,还会输出当前类用到的常量池等信息。
    • javap -l 会输出行号和本地变量表信息。
    • javap -c 会对当前class字节码进行反编译生成汇编代码。

    详细解析请看: 通过javap命令分析java汇编指令

    javap 分析装箱拆箱

    关于equals比较

    double i0 = 0.1;
    Double i1 = new Double(0.1);
    Double i2 = new Double(0.1);
    System.out.println(i1.equals(i2)); //true 2个包装类比较,比较的是包装的基本数据类型的值
    
    //javap 分析这句话
    System.out.println(i1.equals(i0)); //true 基本数据类型和包装类型比较时,会先把基本数据类型包装后再比较
    

    基本数据类型和包装类比较时,会先把基本数据类型包装成对应的包装类型,再进行比较。这一点可以通过查看.class字节码来证明:

    关于 == 比较

    对于基本数据类型,==(双等号)比较的是值,而对于包装类型,==(双等号)比较的则是2个对象的内存地址。

    double i0 = 0.1;
    Double i1 = new Double(0.1);
    Double i2 = new Double(0.1);
    System.out.println(i1 == i2);    //false new出来的都是新的对象
    
    //javap 分析这句话
    System.out.println(i1 == i0);    //true 基本数据类型和包装类比较,会先把包装类拆箱
    

    基本数据类型和包装类型比较时,会先把包装类拆箱再进行值比较(和equals是反的)。这个也可以通过查看字节码来证明:

  • 相关阅读:
    JAVA的泛型与反射的联合应用
    jsp文件过大,is exceeding 65535 bytes limit
    Eclipse闪退解决方案
    EL中定义函数
    JAVA开发工作流程
    理解HTTP协议
    umask函数
    utime修改文件的存取,修改时间
    Linux C ftruncate 函数清空文件注意事项(要使用 lseek 重置偏移量)
    如何实现多进程写一个文件
  • 原文地址:https://www.cnblogs.com/frankcui/p/12134360.html
Copyright © 2011-2022 走看看