[英]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.