我看到一些 API 接受方法作为参数。但不知道它们实际上是如何工作的。可能在内部使用了一些反射,但不知道如何使用。
请告诉我应该如何编写一个可以接受方法作为输入的方法?例如;
someMethod(on(SomeClass.class).someMethod());
替代方案:
someMethod("fieldName" , SomeClass.class);
但它不是类型安全的。创建枚举将是一个额外的负担。
最佳答案
在 Java 中,您通常会编写如下接口(interface):
public interface Function{
public void apply();
}
然后你可以像这样使用你的函数:
static void main( String args[] ){
callSomeMethod( new Function(){
public void apply(){
System.out.println( "hurray" );
}
} );
}
static void callSomeMethod( Function f ){
f.apply();
}
在 Java 8 中,通过添加 lambda,这将大大简化。 但暂时这就是 java 中的实现方式。
内置类
Java 有一些内置的通用类。例如,看一下可调用的: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html
反射(reflection)
您还可以使用反射。上面的例子看起来像这样:
class Thing{
public void whatever(){
System.out.println( "hi!" );
}
}
public static void main( String args[] ){
Thing thing = new Thing();
callSomeMethod( thing, "whatever" );
}
public static void callSomeMethod( Object obj, String methodName ){
obj.getClass().getMethod( methodName ).invoke( obj );
}
但是,与上述方法相比,反射速度相当慢,而且还会失去静态类型安全性。总而言之,如果不是绝对必要,我建议不要这样做。
关于java - 接受一个方法作为另一个方法的输入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16350922/