使用反射调用时,有什么方法可以区分这两种方法吗?
public void method(Object[] args) {}
public void method(Object... args) {}
答案 0 :(得分:2)
您可以通过Parameter#isVarArgs()
测试Parameter
是否为varargs参数。
如果此参数表示变量参数列表,则返回
true
;否则返回false
。
Executable
接口具有similar method,Constructor
和Method
都可以实现。
如果声明该可执行文件采用可变数量的参数,则返回
true
;否则返回false
。
但是,如果我正确理解了为什么,您在问这个问题,那么知道此信息将无济于事。参数是否为varargs不会影响您如何调用Method#invoke
。正如GhostCat提到并由Ferrybig暗示的那样,您将需要以任何一种方式传递数组(作为单个参数)。有关示例,请参见this question。
答案 1 :(得分:1)
一个不同的非回答:反射无关紧要。这两种方法都希望将Object数组作为参数传递。
当两种方法的使用方式完全相同时,为什么源代码说“数组”或“变量”会很重要?您会看到,当不需要信息来做您需要做的事情时,那么不关心该细节是一件好事。
除此之外:显然,编译器需要能够区分这两种方法,因此该信息在类文件中可用。但是,如前所述,这并不重要。因此,如果您不能使用反射来区分期望数组的方法和期望变量的方法,这也不会令我感到惊讶。