Java:Java 是否在幕后将方法参数转换为数组?
Java: Does Java converts method arguments to array under the hood?
我正在尝试理解反射,目前正在研究如何在只有名称为字符串的情况下调用实例方法。因此,可以使用 java.lang.reflect.Method
中的 invoke
。令我困扰的是它的签名 invoke(Object obj, Object... args)
其中第一个参数是将调用该方法的实例,第二个参数只是用于方法调用的参数数组。在反射的情况下,将参数作为数组传递是唯一的选择,因为 invoke
可以使用任意数量的参数调用方法。对我来说真正有趣的是当你直接调用方法(没有反射)时会发生同样的事情,参数是否也转换为数组?例如。我的 FooClass
中有这样的方法 void foo(int x, String s, Bar bar)
如果我以常规方式调用 foo
new FooClass().foo(7, "HelloWorld", new Bar())
会 Java 在幕后将所有这三个参数转换为数组好吧,或者仅当您使用反射调用方法时才使用带参数的数组?
谢谢
不,从参数创建数组会导致太多开销。该数组仅在 invoke
情况下使用,因为...还有什么可做的?你将如何设计一个可以被任意数量的对象和类型调用的方法?您唯一的选择是可变参数 Object... args
。 (除了直接数组,这使得调用它更加麻烦或重载,例如使用 1、2、3、... 参数调用它)
我正在尝试理解反射,目前正在研究如何在只有名称为字符串的情况下调用实例方法。因此,可以使用 java.lang.reflect.Method
中的 invoke
。令我困扰的是它的签名 invoke(Object obj, Object... args)
其中第一个参数是将调用该方法的实例,第二个参数只是用于方法调用的参数数组。在反射的情况下,将参数作为数组传递是唯一的选择,因为 invoke
可以使用任意数量的参数调用方法。对我来说真正有趣的是当你直接调用方法(没有反射)时会发生同样的事情,参数是否也转换为数组?例如。我的 FooClass
中有这样的方法 void foo(int x, String s, Bar bar)
如果我以常规方式调用 foo
new FooClass().foo(7, "HelloWorld", new Bar())
会 Java 在幕后将所有这三个参数转换为数组好吧,或者仅当您使用反射调用方法时才使用带参数的数组?
谢谢
不,从参数创建数组会导致太多开销。该数组仅在 invoke
情况下使用,因为...还有什么可做的?你将如何设计一个可以被任意数量的对象和类型调用的方法?您唯一的选择是可变参数 Object... args
。 (除了直接数组,这使得调用它更加麻烦或重载,例如使用 1、2、3、... 参数调用它)