如何在不知道使用java.lang.reflect的参数计数的情况下调用方法?

时间:2016-03-30 21:40:28

标签: java reflection variadic-functions

我阅读了一篇关于java.öang.reflect的教程,并找到了一种从类中获取方法并使用给定参数调用它的方法:

// general case
template <typename K, typename V>
    int Hash<K, V>::hf(const K& key)
    {
        return key*2654435761;
    }

// string case
template <typename V>
    int Hash<std::string, V>::hf(const std::string& key)
    {
        return MurmurHash2(key.c_str(), key.size());
    }

这会调用静态方法“method”,它将“parameter-value1”作为唯一参数。

现在它非常整洁,但它没有足够的动态。我想调用一个方法,我只有方法对象,并插入一个未指定数量的参数。假设我有Method method = /*some initialization*/; Object returnValue = method.invoke(null, "parameter-value1"); Method method(用作调用Object[] parameters的参数)。

是否可以通过使用reflect来编写一个简短的方法来调用具有给定参数的任何方法?如果是这样:如何实现这个目标?

1 个答案:

答案 0 :(得分:2)

不,这是不可能的。 可以使用给定的Object[]作为参数调用方法。但是有一些限制:

  • 参数的数量必须与方法的参数数量相匹配,因此无法使用任意数量的参数调用它。嗯,这是可能的,但除了抛出的异常外,你什么也得不到。
  • 参数的类型必须与方法的必需参数类型匹配。与上面相同,无效的参数类型会导致异常。

幸运的是,这两个都是已知的,感谢Method#getParameterTypes()

Class<?>[] parameterTypes = someMethod.getParameterTypes();
int parameterCount = parameterTypes.length;