Java Reflection.getMethod int vs Integer

Java Reflection.getMethod int vs Integer,java,reflection,integer,primitive-types,Java,Reflection,Integer,Primitive Types,我在包mypackage中有一个类MyClass,如下所示: package mypackage; public class MyClass{ public static myMethod (Integer i) { return i + " is an Integer"; } public static myMethod (int i){ return i + " is an int" } } public class I

我在包
mypackage
中有一个类
MyClass
,如下所示:

package mypackage;
public class MyClass{

    public static myMethod (Integer i) {
        return i + " is an Integer";
    }

    public static myMethod (int i){
        return i + " is an int"
    } 
}
public class Invoker{

    public String call(String class_name, String method_name, Serializable[] parameters){
        int p_amount = parameters.length;
        Class<?> param_types = new Class[p_amount];

        // Get types of parameters
        for (int i = 0; i < p_amount; i++){
            param_types[i] = parameters[i].getClass();
        }

        // Get method with that signature
        Method m = Class.forName(class_name).getMethod(method_name, param_types); 

        // Invoke method with given parameters
        m.invoke(null, parameters); 
    } 
}
还有一个类
调用程序
,如下所示:

package mypackage;
public class MyClass{

    public static myMethod (Integer i) {
        return i + " is an Integer";
    }

    public static myMethod (int i){
        return i + " is an int"
    } 
}
public class Invoker{

    public String call(String class_name, String method_name, Serializable[] parameters){
        int p_amount = parameters.length;
        Class<?> param_types = new Class[p_amount];

        // Get types of parameters
        for (int i = 0; i < p_amount; i++){
            param_types[i] = parameters[i].getClass();
        }

        // Get method with that signature
        Method m = Class.forName(class_name).getMethod(method_name, param_types); 

        // Invoke method with given parameters
        m.invoke(null, parameters); 
    } 
}
有没有办法指定我可以使用
int
作为参数调用该方法

我的猜测是,当
int
作为一个
Serializable
对象传递时,它会自动解析为它的表亲,即真正的对象
Integer
,但我不是Java专家

更新
这与中的问题不同,因为这里有一个直接调用,这里有一个方法在中间将
int
装箱为
Integer
。正如我之前提到的,这是我的想法,但我需要其他人对此事的意见和知识

是的,您可以使用
int.class
Integer.TYPE
来识别整数原语。

您是对的,给定了代码,就没有办法了。您可以为
调用
创建原语专门化。如果同一个方法有一个原语和一个匹配的装箱值重载,这将引发两个类似的问题。理想情况下,您应该只更改类,使方法具有不同的名称。但如果做不到这一点,您可以按照@Tunaki所说的去做。在许多情况下,根据参数类型查找方法是行不通的。例如,传递字符串以调用以对象为参数的方法也不起作用,因为
getMethod()
需要实际声明的方法参数类型。@Tunaki,您对原语专门化的意思是什么?如果参数[I].getClass().equals(Integer.class){param_type[I]=int.class}
,我可以执行
,但这样我就永远不会得到签名中带有
整数的方法。如果我对“原始专业化”理解错误,请纠正。@regina_fallangi我的意思是重载
调用
方法。您可以创建第二个签名为
publicstringcall(stringclass\u name,stringmethod\u name,int[]参数)
(尽管它的使用非常有限)。也许你根本不需要
呼叫
?这不是问题所在。调用
getMethod()
时,该参数已被装箱为一个
整数
,该方法无法知道它原来是什么。@biziclop完全正确。有趣的是,这个答案是…@regina_fallangi最受欢迎的答案。如果这个答案不能回答你的问题,你需要更清楚这个问题是什么。使用反射时,指定方法参数为基元
int
的方法是使用
int.class
@regina\u fallangi,这样您就得到了答案,阅读此问题的人会被重定向到一个非常类似的问题,并给出解决方案。