Java 通过反射区分方法是否具有任意数量的参数

Java 通过反射区分方法是否具有任意数量的参数,java,reflection,Java,Reflection,在使用反射调用它时,有没有办法区分这两种方法 public void method(Object[] args) {} public void method(Object... args) {} 一个明显的非答案是:这与反思无关。这两种方法都希望对象数组作为参数传递 当这两种方法在反射中使用完全相同的方式时,为什么源代码会说“array”或“varargs”呢?!你看,当你需要做的事情不需要信息时,最好不要在意细节 除此之外:显然,编译器需要能够区分这两种方法,因此信息可以在类文件中找到。但

在使用反射调用它时,有没有办法区分这两种方法

public void method(Object[] args) {}

public void method(Object... args) {}

一个明显的非答案是:这与反思无关。这两种方法都希望对象数组作为参数传递

当这两种方法在反射中使用完全相同的方式时,为什么源代码会说“array”或“varargs”呢?!你看,当你需要做的事情不需要信息时,最好不要在意细节


除此之外:显然,编译器需要能够区分这两种方法,因此信息可以在类文件中找到。但是,正如前面所说的那样,这并不重要。因此,如果不能使用反射来区分需要数组的方法和需要vararg的方法,我也不会感到惊讶

您可以通过测试
参数
是否为varargs参数

如果此参数表示变量参数列表,则返回
true
;否则返回
false


该接口有一个构造函数,它由
构造函数
方法
实现

如果此可执行文件被声明为具有可变数量的参数,则返回
true
;否则返回
false



然而,如果我正确理解你为什么问这个问题,知道这些信息对你没有帮助。参数是否为varargs并不影响调用
方法#invoke
的方式。正如GhostCat所提到的和Ferrybig所暗示的那样,您需要以任意一种方式传递数组(作为单个参数)。请参阅以获取一些示例。

您的问题没有实际意义,因为此代码甚至无法编译。它失败,出现错误消息
错误:无法同时声明方法(对象…)和方法(对象[])
。显然,这段代码没有编译。问题是如何根据无法编译来区分方法是以一种方式声明的还是以另一种方式声明的,我假设两个签名在运行时显示相同,即
Object[]
。但是,为什么您需要知道它们之间的区别呢?因为我接收到一个对象数组,我想在调用方法之前知道我可以使用接收到的参数调用它。如果我有一个Object[]参数,我只能有一个参数;否则,我可以有3个甚至0个参数。不,你不能。这就是人们一再试图告诉你的。运行时没有varargs。如果要使用反射调用varargs方法,则必须传递一个数组!这不是我想要的。在调用方法之前,我想知道接收到的参数是否正常。因此,我需要知道该方法接受多少个参数,在使用对象时传入3个参数是可以的。。。但不是对象[]这是我想要的。编译器如何知道方法是用对象定义的。。。不要反对,弗朗西斯科·洛丹,不,这不是你要的。反射与编写编译器不同。编译器必须理解确切的类型。反省一下,重要的是两者之间没有区别。当然,另一个答案告诉了您如何找到答案,但同样:这并没有改变这样一个事实,即调用这样一个方法的代码只关心传递一个数组!不,传递3个参数是不好的。您的代码必须创建一个临时数组并传递一个参数。实际上,如果我们也考虑MethodHandles,这可能会对反射产生影响,但是与添加逻辑来处理这种情况相比,只转换方法句柄而不使用varargs更容易:请注意,尽管varargs看起来像多个参数,编译后,它只是成为一个接受varargs类型数组的参数。实际上,如果我们也考虑MethodHandles,它可能会影响反射,但与添加逻辑来处理这种情况相比,更容易将方法句柄转换为不使用varargs: