0

我看到一些 API 接受方法作为参数。但不知道它们实际上是如何工作的。可能在内部使用了一些反射,但不知道如何。

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

someMethod(on(SomeClass.class).someMethod());

选择:

someMethod("fieldName" , SomeClass.class);

但它不是安全类型。并且创建枚举将是一个额外的负担。

4

4 回答 4

2

在 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 中,这将通过添加 lambda 大大简化。但目前这就是它在java中的完成方式。

内置类

Java 有一些内置的通用类。例如看看可调用: 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 ); 
}

但是,与上述方法相比,反射非常慢,并且您也失去了静态类型安全性。总而言之,如果不是绝对必要,我建议不要这样做。

于 2013-05-03T03:07:30.843 回答
1

在 java 中,这通常是通过实现RunnableCallable的类来完成的

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

于 2013-05-03T03:05:40.897 回答
0

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

于 2013-05-03T03:10:52.953 回答
0

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

于 2013-05-03T03:14:53.810 回答