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,这样您就得到了答案,阅读此问题的人会被重定向到一个非常类似的问题,并给出解决方案。