Java:Java 是否在幕后将方法参数转换为数组?

标签 java reflection jvm

我正在尝试理解反射,目前正在研究如何在只有字符串名称的情况下调用实例方法。为此invoke来自 java.lang.reflect.Method可以使用。困扰我的是它的签名invoke(Object obj, Object... args)其中第一个参数是调用方法的实例,第二个参数只是方法调用的参数数组。在反射作为数组传递参数的情况下是唯一的选择,因为 invoke可以使用任意数量的参数调用方法。对我来说真正有趣的是,当您直接调用方法(没有反射)时会发生同样的事情,参数是否也转换为数组?例如。我有这样的方法void foo(int x, String s, Bar bar)在我的 FooClass如果我打电话 foo以常规方式 new FooClass().foo(7, "HelloWorld", new Bar())引擎盖下的 Java 是否也会将所有这三个参数都转换为数组,还是仅在使用反射调用方法时才使用带参数的数组?谢谢

最佳答案

不,从参数创建一个数组会导致太多的开销。该数组仅用于 invoke情况,因为……还有什么可做的?你将如何设计一个可以被任意数量的对象和类型调用的方法?您唯一的选择是可变参数 Object... args . (除了直接数组,调用它更麻烦或重载,例如用 1, 2, 3, ... 参数调用它)

关于Java:Java 是否在幕后将方法参数转换为数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65340068/

相关文章:

java - 推荐从 Jersey 开始的 Maven 原型(prototype)

java - 安卓 :how to fixed size of image view programatically?

ios - 如何将反射与 Core Data 和 Swift 结合使用

kotlin - 我如何在枚举中使用函数引用?

java - 使用自定义适配器中的变量时遇到问题

java - 为什么JButton不压抑?

java - 当我有字符串时,如何调用需要未知原语的方法?

c# - Dynamically Flat C# object class 运行时的属性列表

java - invokedynamic 及其对应用程序开发人员的优势

java - Linux - Java - VM 初始化期间发生错误