1、运行你要反编译的java程序

运行程序

2、找到target相同目录下的同名class文件

注意:若没找到就rebuilt下程序
查找class文件

3、实例

3.1、反编译技术对自动拆装箱的陷阱的探讨

源程序如图:
package com.chan.test;

/**
 * 截取自JVM虚拟机 377 面的 自动拆装箱的陷阱
 * @author lone_wolf
 * @version 1.0
 * @date 2021/12/5 16:53
 */
public class AutoPackageTest {
    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 321;
        Integer f = 321;
        Long g = 3L;
        /*true*/
        System.out.println(c == d);
        /*false*/
        System.out.println(e == f);
        /*true*/
        System.out.println(c == (a + b));
        /*true*/
        System.out.println(c.equals(a + b));
        /*true*/
        System.out.println(g == (a + b));
        /*false*/
        System.out.println(g.equals(a + b));
    }
}

反编译后:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.chan.test;

public class AutoPackageTest {
    public AutoPackageTest() {
    }

    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 321;
        Integer f = 321;
        Long g = 3L;
        System.out.println(c == d);
        System.out.println(e == f);
        System.out.println(c == a + b);
        System.out.println(c.equals(a + b));
        System.out.println(g == (long)(a + b));
        System.out.println(g.equals(a + b));
    }
}

问题:

在这里插入图片描述

结论:

这里也是深入JVM虚拟机书的377面的原话:

  1. 包装类的"=="运算在不遇到算术运算符的情况下不会自动拆装箱
  2. 它们equals()方法并不处理数据转型
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐