Java反射,获取参数类型

Java反射,获取参数类型,java,reflection,parameters,Java,Reflection,Parameters,我有一个方法callMethod,它接受参数:methodName(字符串)和参数(Object[])。 现在,一开始我觉得一切都很好,但我偶然发现了一个问题。 要使用反射,必须知道对象的类型。到目前为止,我是这样决定的: Class[] getParameterTypes(Object[] parameters) { Class[] parameterTypes = new Class[parameters.length]; for (int i = 0; i < par

我有一个方法callMethod,它接受参数:methodName(字符串)和参数(Object[])。 现在,一开始我觉得一切都很好,但我偶然发现了一个问题。 要使用反射,必须知道对象的类型。到目前为止,我是这样决定的:

Class[] getParameterTypes(Object[] parameters) {
    Class[] parameterTypes = new Class[parameters.length];
    for (int i = 0; i < parameters.length; i++) {
        parameterTypes[i] = parameters[i].getClass();
    }
    return parameterTypes;
}
谢谢您的帮助。

如果调用者基于变量类型期望重载解析,那么您的代码也会失败。例如:

void foo(String x) {}
void foo(Object x) {}

Object x = "text";
foo(x);
。。。将调用
foo(Object)
而不是
foo(String)
,但是您的反射代码将调用
foo(String)

现在,我们对您的用例了解不够,无法判断这是否是一个问题。如果调用方确实知道要调用哪个方法,使用哪个参数类型,那么最好是传递它们

如果上述情况不会发生在您的上下文中,您可能希望在反射代码中执行某种基本的重载解析:

  • 查找具有正确名称和正确参数数的所有方法
  • 检查每个方法,查看是否所有参数值都可分配给相应的参数类型(请参阅-您可能需要单独处理原语)
  • 如果有多个匹配方法,请应用一些规则来确定要调用的方法。这些规则不必与Java相同,但您需要确保它们是清晰的
void foo(String x) {}
void foo(Object x) {}

Object x = "text";
foo(x);