【问题标题】:How does JVM implement the varargs?JVM 如何实现可变参数?
【发布时间】:2014-03-11 21:13:09
【问题描述】:

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

void method(int x, String.. args) {
  // Do something
}

这实际上是如何在运行时级别实现的?我想到的是,当我们有电话时:

method(4, "Hello", "World!");

最后两个参数在内部转换为一个数组,然后传递给方法。我对此是否正确,或者 JVM 实际上将堆栈引用推送到字符串,而不仅仅是对数组的引用?

【问题讨论】:

    标签: java internals


    【解决方案1】:

    它是在编译时级别实现的。你的方法被编译成字节码为

    varargs method(I[Ljava/lang/String;)V
    ...
    

    相当于

    void method(int x, String[] args) {
    ...
    

    带有varargs 标志。

    还有

    method(4, "Hello", "World!");
    

    编译为

    method(4, new String[] {"Hello", "World!"});
    

    【讨论】:

      【解决方案2】:

      这样的方法转换成

      void method(int x, String[] args) {
      }
      

      及其调用

      method(4, "Hello", "World!");
      

      转换成

      method(4, new String[]{"Hello", "World!"});
      

      注意最后一次调用可以直接写。这在覆盖可变参数方法时很有用:

      @Override
      void method(int x, String... args) {
          String[] newArgs=new String[];
          ... // fill new args; then
          super.method(newArgs);
      }
      

      【讨论】:

        【解决方案3】:

        最后两个参数在内部转换为一个数组,然后传递给方法。我说得对吗,

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

        为了确保如果您看到该调用的字节码,您可以在那里看到数组。一个数组创建并传递到目的地。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-23
          • 2014-07-11
          • 1970-01-01
          • 1970-01-01
          • 2021-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多