JVM如何实现varargs?
我最近对Java中的这种function感兴趣,作为具有可变数量参数的函数。 这是一个非常酷的function。 但我很感兴趣:
void method(int x, String.. args) { // Do something }
这是如何在运行时级别实际实现的? 我想到的是,当我们打电话时:
method(4, "Hello", "World!");
最后两个参数在内部转换为一个数组,并传递给该方法。 我是对的,或者JVM实际上是在堆栈中引用字符串,而不仅仅是对数组的一个引用?
它在编译时实现。 您将方法编译为字节码为
varargs method(I[Ljava/lang/String;)V ...
这相当于
void method(int x, String[] args) { ...
与varargs
标志。
和
method(4, "Hello", "World!");
编译为
method(4, new String[] {"Hello", "World!"});
这样的方法被转换成
void method(int x, String[] args) { }
和它的电话
method(4, "Hello", "World!");
转换成
method(4, new String[]{"Hello", "World!"});
请注意,最后一个呼叫可以直接写入。 这在覆盖vararg方法时很有用:
@Override void method(int x, String... args) { String[] newArgs=new String[]; ... // fill new args; then super.method(newArgs); }
最后两个参数在内部转换为一个数组,并传递给该方法。 我是对的,
是的 ,你的理解是正确的。 数组构造并作为参数传递。
要确保如果看到该调用的字节代码,则可以在那里看到该数组。 数组创建并传递到目标。