【问题标题】:How do Java 8 array constructor references work?Java 8 数组构造函数引用如何工作?
【发布时间】:2015-06-09 10:49:29
【问题描述】:

假设我们有一个IntFunction 类型的变量,它返回一个整数数组:

IntFunction<int[]> i;

使用 Java 8 泛型,可以使用如下构造函数引用来初始化此变量:

i = int[]::new

Java 编译器如何将其转换为字节码?

我知道对于其他类型,比如String::new,它可以使用invokedynamic指令指向String构造函数java/lang/String.&lt;init&gt;(...),这只是一个具有特殊含义的方法。

这如何与数组一起工作,看到有构造数组的特殊说明吗?

【问题讨论】:

  • 在 Java 中,这些被称为引用,而不是指针。一般来说,引用提供了指针的几乎所有操作,除了你不能给引用添加任意偏移量,或者对它们执行其他类型的数学运算。

标签: java arrays java-8 method-reference


【解决方案1】:

你可以通过反编译java字节码找到自己:

javap -c -v -p MyClass.class

编译器将 Foo[]::new 引用到 lambda (i -&gt; new Foo[i]),然后像任何其他 lambda 或方法引用一样继续进行。这是这个合成 lambda 的反汇编字节码:

private static java.lang.Object lambda$MR$new$new$635084e0$1(int);
descriptor: (I)Ljava/lang/Object;
flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
Code:
  stack=1, locals=1, args_size=1
     0: iload_0       
     1: anewarray     #6                  // class java/lang/String
     4: areturn       

(它的返回类型是Object,因为IntFunction中擦除的返回类型是Object。)

【讨论】:

    猜你喜欢
    • 2021-06-18
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 2018-09-23
    相关资源
    最近更新 更多