JVM基础 -- Java语法糖
自动装拆箱
Java代码
1 | public int foo() { |
字节码
1 | public int foo(); |
自动装箱
1 | // 字节码中的方法描述符:java/lang/Integer.valueOf:(I)Ljava/lang/Integer |
自动拆箱
1 | // 字节码中的方法描述符:java/lang/Integer.intValue:()I |
泛型与类型擦除
截取上面关键的字节码
1 | // 伪泛型,add(Object):Z |
- Java程序里面的泛型信息,在JVM里面全部丢失
- 主要是为了兼容引入泛型之前的代码
- Java编译器会选取该泛型能指代的所有类中层次最高的那个,作为替换泛型的类
- 对于限定了继承类的泛型参数,类型擦除后,所有的类型参数都会变成所限定的继承类
- 否则,将默认限定了继承自Object
Java代码
1 | public class Generic<T extends Number> { |
字节码
1 | T func(T); |
- 方法描述符的接收参数类型以及返回参数类型都是Number
- 字节码仍然存在泛型参数的信息,例如
T func(T);和方法签名(TT;)TT;- 这类信息主要在Java编译器编译其他类时使用
foreach
数组
1 | public void funa(int[] array) { |
Iterable对象
1 | public void func(List<Iterable> list) { |
switch
Java代码
1 | public void func(String s) { |
字节码
1 | public void func(java.lang.String); |
- 每个case截获的字符串都是一个常量值,取其hashCode,当成int值的switch
- 由于hashCode有可能发生碰撞,因此还需要借助
String.equals逐个比较发生了碰撞的字符串
参考资料
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.








