2015-11-19 70 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