使用反射调用静态方法

时间:2017-03-01 06:48:59

标签: java reflection

我的项目包含此包: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

我使用以下代码从Controller A或B调用insert方法,这取决于某些条件

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

如果我的措辞不正确,我道歉

2 个答案:

答案 0 :(得分:2)

您在方法查找和实例中将类作为varargs传递,对于静态调用和调用中的参数,该类为null:

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)

答案 1 :(得分:0)

问题解决了:))

ModelA和ModelB实现相同的接口,例如Model(不重要),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);

全部谢谢