2017-03-01 137 views
0

我的項目靜態方法包含此包:com.X.Y.Z.controller調用使用反射

此套餐包括3個文件

ControllerA.java

public class ControllerA { 
    public static void insert(Context context, ModelA model) {/*do somethings*/} 
    } 

ControllerB.java

public class ControllerB { 
    public static void insert(Context context, ModelB model) {/*do somethings*/} 
    } 

MainController。 java

我使用以下代碼從控制器A調用insert方法或B這取決於一些條件

public static void insert(Context context, Object object) { 
    Class<?> clazz = Class.forName(mClass); //Controller A or B 
    Method method = clazz.getMethod("insert", ?); 
    method.invoke(null, ?); 
} 

如何傳遞參數?對象可以是MODELA或ModelB

+0

invoke(Object obj,Object ... args)需要作爲參數,調用底層方法的對象,以及用於方法調用的參數 – sreejit

+1

您需要調用'clazz.getMethod(「insert」,Context .class,CCC)'其中'CCC'可以是'ModelA.class'或'ModelB.class'。但是我沒有看到你有什麼方法獲得'Model'類。將它作爲參數傳遞給'insert',還是會有其他方法來獲取它,或者你想要在類中搜索名爲'insert'的方法,並通過查看方法來找出'Model'類參數? – ajb

+1

如果ModelA和ModelB實現相同的接口,例如Model,則可以傳遞Context.class和Model.class作爲getMethod的第二個和第三個參數。 –

回答

0

問題解決:)

MODELA和ModelB實現相同的接口,例如模型(並不重要),model.getClass()是一個重要的組成部分他

public static void insert(Context context, Model model) { 
    Class<?> clazz = Class.forName(mClass); //Controller A or B 
    Method method = clazz.getMethod("insert", Context.class, model.getClass()); 
    method.invoke(null, new Object[]{context, model})); 
} 

現在我可以用這個:

Controller.insert(this, myModelA); 
Controller.insert(this, myModelB); 

感謝所有

+1

'invoke()'方法被定義爲將'Object ...'作爲它的參數,所以你不需要自己創建數組,雖然它可以工作。 'method.invoke(null,context,model)'應該是等價的。 – ajb

2

您傳遞的類中的方法查找和實例,這是空的靜態調用可變參數和我道歉,如果我的措辭是不正確的參數調用:

boolean useA = true; // use A or B variant: 
Method m = clazz.getMethod("insert", Context.class, useA ? ModelA.class : ModelB.class); 
m.invoke(null, context, object) 
+0

我想他想使用'object'作爲被調用'insert'的最後一個參數。沒有任何名爲'modelA'或'modelB'的變量。但'invoke'需要一個'Objects'列表,所以你可以只傳遞'object'作爲最後一個參數,讓'invoke()'擔心轉換它。 – ajb

+0

謝謝,我更新了代碼 – Harald