我正在尝试理解反射,目前正在研究如何在只有字符串名称的情况下调用实例方法。为此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/