Java OpenResty Spring Spring Boot MySQL Redis MongoDB PostgreSQL Linux Android Nginx 面试 算法 小程序 Arthas JVM juc AQS Docker DevOps


Java 语法糖 - 可变参数

Java 大约 2130 字

本质

可变参数本质就是数组。

Java 代码

可以看到String... args可变参数可以直接赋值给String[]数组。

public class Test3 {

    public static void foo(String... args) {
        String[] arr = args;
        System.out.println(arr);
    }

    public static void main(String[] args) {
        foo("a", "b"); // 等价于foo(new String[]{"a", "b"});
    }

}

字节码

可以看到:

foo方法的LocalVariableTable0号槽位是args,签名也是数组。

main方法中使用的是anewarray字节码,等价于foo(new String[]{"a", "b"})

对于foo()等价于foo(new String[]{})

  public static void foo(java.lang.String...);
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0089) ACC_PUBLIC, ACC_STATIC, ACC_VARARGS
    Code:
      stack=2, locals=2, args_size=1
         0: aload_0
         1: astore_1
         2: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         5: aload_1
         6: invokevirtual #3                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
         9: return
      LineNumberTable:
        line 6: 0
        line 7: 2
        line 8: 9
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      10     0  args   [Ljava/lang/String;
            2       8     1   arr   [Ljava/lang/String;
    MethodParameters:
      Name                           Flags
      args

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=4, locals=1, args_size=1
         0: iconst_2
         1: anewarray     #4                  // class java/lang/String
         4: dup
         5: iconst_0
         6: ldc           #5                  // String a
         8: aastore
         9: dup
        10: iconst_1
        11: ldc           #6                  // String b
        13: aastore
        14: invokestatic  #7                  // Method foo:([Ljava/lang/String;)V
        17: return
      LineNumberTable:
        line 11: 0
        line 13: 17
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      18     0  args   [Ljava/lang/String;
    MethodParameters:
      Name                           Flags
      args
阅读 83 · 发布于 2022-04-21

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批