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

时间:2019-07-09 05:25:50

标签: java reflection

使用反射调用时,有什么方法可以区分这两种方法吗?

public void method(Object[] args) {}

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

2 个答案:

答案 0 :(得分:2)

您可以通过Parameter#isVarArgs()测试Parameter是否为varargs参数。

  

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


Executable接口具有similar methodConstructorMethod都可以实现。

  

如果声明该可执行文件采用可变数量的参数,则返回true;否则返回false


但是,如果我正确理解了为什么,您在问这个问题,那么知道此信息将无济于事。参数是否为varargs不会影响您如何调用Method#invoke。正如GhostCat提到并由Ferrybig暗示的那样,您将需要以任何一种方式传递数组(作为单个参数)。有关示例,请参见this question

答案 1 :(得分:1)

一个不同的非回答:反射无关紧要。这两种方法都希望将Object数组作为参数传递。

当两种方法的使用方式完全相同时,为什么源代码说“数组”或“变量”会很重要?您会看到,当不需要信息来做您需要做的事情时,那么不关心该细节是一件好事。

除此之外:显然,编译器需要能够区分这两种方法,因此该信息在类文件中可用。但是,如前所述,这并不重要。因此,如果您不能使用反射来区分期望数组的方法和期望变量的方法,这也不会令我感到惊讶。