简体   繁体   English

使用反射调用静态方法

[英]Invoke static method using reflection

My project contains this package : com.XYZcontroller 我的项目包含以下软件包: com.XYZcontroller

This package includes 3 files 该软件包包括3个文件

ControllerA.java ControllerA.java

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

ControllerB.java ControllerB.java

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

MainController.java MainController.java

I use following code to invoke insert method from Controller A or B it depends on some condition 我使用以下代码从控制器A或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, ?);
}

how do i pass arguments ? 我如何传递参数? object may be ModelA or ModelB 对象可以是ModelA或ModelB

I apologize if my wording is not true 如果我的措辞不正确,我深表歉意

You pass the classes as varargs in the method lookup and the instance, which is null for a static invocation and the arguments in the invocation: 您在方法查找和实例中将这些类作为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)

Problem solved:) 问题解决了:)

ModelA and ModelB implement the same interface, for example Model (not important) , model.getClass() is an important part of his 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}));
}

Now i can use this : 现在我可以使用这个:

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

Thanks all . 谢谢大家

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM