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

时间:2013-05-03 03:01:29

标签: java reflection

我看到一些API接受方法作为参数。但不知道他们是如何工作的。可能会在里面使用一些反射,但不知道如何。

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

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

替代:

someMethod("fieldName" , SomeClass.class);

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

4 个答案:

答案 0 :(得分: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有一些内置的通用类。比如看看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 ); 
}

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

答案 1 :(得分:1)

在java中,通常使用实现RunnableCallable

的类来完成

因此,您传递的对象具有可以调用的函数,而不是传入函数。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果该方法已存在于类中,则可以使用java反射。 看看这里 java reflection tutorial