繁体   English   中英

JVM如何实现varargs?

[英]How does JVM implement the varargs?

我最近对Java中的这种功能感兴趣,作为具有可变数量参数的函数。 这是一个非常酷的功能。 但我很感兴趣:

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);
}

最后两个参数在内部转换为一个数组,并传递给该方法。 我是对的,

是的 ,你的理解是正确的。 数组构造并作为参数传递。

要确保如果看到该调用的字节代码,则可以在那里看到该数组。 数组创建并传递到目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM