2015-11-19 66 views
1

我在包mypackageMyClass它看起来像这样: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作为参数调用该方法?

我的猜测是,当intSerializable对象被传递,它会自动被解析到其表弟,真正的对象,Integer,但我不是一个Java专家...

更新 这与here不是同一个问题,因为那里有一个直接调用,这里有一个方法,它把int变成Integer。正如我之前提到的那样,这是我的想法,但希望其他人对此事的看法和知识。

+3

你是对的,给你的代码,没有办法绕过它。你可以为'call'创建原始的专门化。 – Tunaki

+0

如果你对同一个方法有一个原始的和匹配的盒装值超载,那会引发一些像这样的问题。理想情况下,你应该改变你的班级,以便方法有不同的名字。但是,如果没有这个,你可以跟@Tunaki说的一样。 – biziclop

+2

根据参数类型查找方法在许多情况下不起作用。例如,传递一个字符串来调用一个以Object为参数的方法也是行不通的,因为'getMethod()'需要方法参数的实际声明类型。 –

回答

2

是的,您可以使用int.classInteger.TYPE来识别整数图元。

+4

这不是问题。在调用'getMethod()'的时候,参数已经被装箱到了一个'Integer'中,这个方法无法知道它原来是什么。 – biziclop

+0

@biziclop是绝对正确的。 –

+1

有趣的是,这个答案是[这个问题]的顶级投票和接受的答案(http://stackoverflow.com/questions/13411426/java-how-to-call-method-by-reflection-with-primitive-types -as-arguments)... – Turing85