我在包mypackage
类MyClass
它看起来像这样:Java反射.getMethod INT VS整数
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"
}
}
还有一类Invoker
,它看起来像这样:
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 number = 3;
new Invoker().call("mypackage.MyClass", "myMethod", number)//->i is an Integer
Is there一种方法来指定我可能会用int
作为参数调用该方法?
我的猜测是,当int
为Serializable
对象被传递,它会自动被解析到其表弟,真正的对象,Integer
,但我不是一个Java专家...
更新 这与here不是同一个问题,因为那里有一个直接调用,这里有一个方法,它把int
变成Integer
。正如我之前提到的那样,这是我的想法,但希望其他人对此事的看法和知识。
你是对的,给你的代码,没有办法绕过它。你可以为'call'创建原始的专门化。 – Tunaki
如果你对同一个方法有一个原始的和匹配的盒装值超载,那会引发一些像这样的问题。理想情况下,你应该改变你的班级,以便方法有不同的名字。但是,如果没有这个,你可以跟@Tunaki说的一样。 – biziclop
根据参数类型查找方法在许多情况下不起作用。例如,传递一个字符串来调用一个以Object为参数的方法也是行不通的,因为'getMethod()'需要方法参数的实际声明类型。 –