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

标签 java reflection

我看到一些 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/

相关文章:

java - 使用 Jackson 对 Scala 案例类进行(反)序列化

java - 使用反射在 jaxb 对象上设置 ArrayList 值时出现问题

c# - Type.GetProperties() 是否保证 PropertyInfo[] 结果的特定顺序?

c# - 如何从未引用的程序集中获取类型?

java - 如何使用反射在运行时更改注释值?

java - 同时插入和更新一个表

java - Crystal 报表仅限于三个并发用户请求

java - Android - 无法使用 Retrofit2 获取 JSON

Java 电子邮件发送队列 - 固定数量的线程发送尽可能多的可用消息

c# - 从 .NET 代码中提取数据