例如,我有以下方法调用:
Requests.sendGet("/type", Model.setTypes);
Model.setTypes是List of Types的setter,我希望sendGet方法能够调用传递给它的任何方法,并且sendGet方法不能只调用Model.setTypes本身,因为它取决于在什么类型的Get请求正在执行。
感谢任何回复的人。
答案 0 :(得分:7)
public interface Command {
public void execute();
}
public class Requests {
public static void sendGet(String url, Command command) {
// Do your stuff here and then execute the command.
command.execute();
}
}
final Model model = getItSomehow(); // Must be declared final.
Requests.sendGet("/type", new Command() {
public void execute() {
model.setType();
}
});
您可以根据需要为execute()
方法添加参数,例如RequestEvent
可以由Requests#sendGet()
创建并在Command#execute()
中访问。
答案 1 :(得分:4)
虽然很笨拙但有可能:您可以使用java.lang.reflect.Method
指向某个方法并调用其invoke
成员来调用它。
但是,几乎在所有情况下,这都不是您想要做的。相反,使用一个接口(即你的函数接受一个实现接口的特定类型的对象),或者你可以使用Runnable
并调用它的run()函数,或{{1}并使用Callable
。
(感谢Crom指出call()
)
答案 2 :(得分:1)
Java没有first class functions:这是函数 - 除其他外 - 可以作为参数传递 - albeit there is a proposal。相反,这个问题通常用Java function objects来解决 - 通常是用单个函数实现接口的对象。一个例子是Collections API Comparator。
因此,在您的情况下,使用单一方法(例如ModelSetter
)定义接口(例如setTypes(List list)
)。定义Request.sentGet(ModelSetter modelSetter)
。
答案 3 :(得分:0)
public void invokeAMethod(Object o, String methodName, String...params){
try{
Class<?> driverClass = o.getClass();
Method[] driverMethod = driverClass.getMethods();
for(Method m : driverMethod) {
if(m.getName().equalsIgnoreCase(methodName)) {
if(m.isVarArgs()) {
Object[] obj = new Object[params.length];
for(int i=0;i<params.length;i++) {
obj[i] = params[i];
}
m.invoke(new Object[]{obj});
}
else
m.invoke(o,params);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
在上面的代码中,参数是: 对象o:调用方法所属的类的对象 String methodName:要调用的方法的名称。 String ... params:要调用的方法的参数。
public class Sample{
public static void main(String[] args){
method2("method1")
}
public void method1(){
System.out.println("method1");
}
public static void method2(String methodName){
invokeAMethod(this,method1);
}
}