接受一个方法作为另一个方法的输入参数



我看到一些api接受方法作为参数。但不知道它们到底是怎么工作的。可能在里面用了一些反射,但不知道怎么用。

请告诉我如何写一个可以接受一个方法作为输入的方法?例如,

someMethod(on(SomeClass.class).someMethod());
替代:

someMethod("fieldName" , SomeClass.class);

但是它不是类型安全的。创建enum将是一个额外的负担。

在Java中,您通常会编写这样的接口:

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中,由于添加了lambdas,这将大大简化。但就目前而言,这是在java中实现的。

内置类

Java有一些内置的泛型类。例如,看看callable:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html

反射

你也可以使用反射。上面的例子看起来像这样:

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中,这通常是通过实现Runnable或Callable的类完成的

所以不是传递一个函数,而是传递一个具有可调用函数的对象。

实现此目的的通用方法是Callable,但是在java中大多数传递方法通常是通过创建接口来完成的。在接口内部,您定义了几个方法来反映您想要做的事情,然后将实现该接口的类作为方法参数传递。

如果该方法已经存在于类中,则可以使用java反射。请看这里Java反射教程

相关内容

  • 没有找到相关文章

最新更新