自动装箱调用包装类的valueOf()静态方法,如Integer.valueOf(int);自动拆箱调用对应包装类的xxxValue()实例方法,如intValue()。

Java 的自动装箱(autoboxing)和拆箱(unboxing)在编译期由 javac 插入对应的方法调用,运行时实际执行的是包装类的静态工厂方法(如 Integer.valueOf())或实例方法(如 intValue())。要确认具体调用了什么方法,最直接的方式是查看编译后的字节码。
使用 javap 查看字节码
编译 Java 源文件后,用 javap -c 命令反编译 class 文件,即可看到每条 Java 语句对应的字节码指令及调用的方法。
- 编译源码:
javac Test.java - 查看字节码:
javap -c Test - 若想同时显示行号和局部变量表,可加
-l和-v参数(如javap -c -l Test)
自动装箱对应的方法调用
当基本类型赋值给对应包装类型(如 Integer i = 100;),编译器会插入 Integer.valueOf(int) 调用:
iconst_100 invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
注意:该方法内部会复用缓存(-128 到 127 范围内的 Integer 实例),但字节码层面始终是 valueOf,不是构造器 new Integer(...)(后者已废弃且不会被自动装箱使用)。
立即学习“Java免费学习笔记(深入)”;
自动拆箱对应的方法调用
当包装类型参与算术运算或赋值给基本类型(如 int j = i; 或 i + 1),编译器会插入对应包装类的 xxxValue() 方法:
-
Integer→intValue() -
Double→doubleValue() -
Boolean→booleanValue()
例如 int j = i; 对应字节码:
aload_1 invokevirtual java/lang/Integer.intValue:()I
常见陷阱与验证建议
某些看似简单的表达式可能隐含多次装箱/拆箱,比如 Integer a = 1; Integer b = 2; Integer c = a + b;:
-
a + b触发两次拆箱(intValue()),一次加法,再装箱(Integer.valueOf()) - 字节码中会出现两个
invokevirtual ... intValue和一个invokestatic ... valueOf - 可通过
javap -c清晰看到这三步,避免误以为是对象相加
不复杂但容易忽略。


















