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

Java 接受一个方法作为另一个方法的输入参数,java,reflection,Java,Reflection,我看到一些API接受方法作为参数。但不知道它们实际上是如何工作的。可能在内部使用了一些反射,但不知道如何使用 请告诉我如何编写一个可以接受方法作为输入的方法?比如, someMethod(on(SomeClass.class).someMethod()); 备选方案: someMethod("fieldName" , SomeClass.class); 但它不是类型安全的。创建枚举将是一个额外的负担。在java中,这通常是通过实现或的类来完成的 因此,不是传递函数,而是传递具有可调用函数的对

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

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

someMethod(on(SomeClass.class).someMethod());
备选方案:

someMethod("fieldName" , SomeClass.class);

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

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


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

在java中,这通常是通过实现或


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

在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(); 
}
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 ); 
}
然后您可以像这样使用您的函数:

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(); 
}
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 ); 
}
在Java8中,通过添加lambdas,这将大大简化。 但就目前而言,java就是这样做的

内置类

Java有一些内置类是泛型的。例如,看看callable:

倒影

也可以使用反射。上面的示例如下所示:

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(); 
}
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中,您通常会编写如下接口:

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(); 
}
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 ); 
}
然后您可以像这样使用您的函数:

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(); 
}
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 ); 
}
在Java8中,通过添加lambdas,这将大大简化。 但就目前而言,java就是这样做的

内置类

Java有一些内置类是泛型的。例如,看看callable:

倒影

也可以使用反射。上面的示例如下所示:

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(); 
}
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中的大多数传递方法通常是通过创建接口来完成的。在接口内部,您定义了几个反映您想要做什么的方法,然后将实现该接口的类作为方法参数传递。

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

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

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

您确定这是一个方法而不是字段名吗?因为它看起来像一个字段名。你的意思是像这样的
someMethod(obj.getFoo())
?是的,它是一个字段的getter方法。对不起,打错了。我更新了问题请参考并使用java反射方法类作为类型您确定它是方法而不是字段名吗?因为它看起来像一个字段名。你的意思是像这样的
someMethod(obj.getFoo())
?是的,它是一个字段的getter方法。对不起,打错了。我已经更新了这个问题,请参考并使用java反射方法类typeyes和no。runnable是一个具有具体用途的类。我更喜欢使用更通用的。在需要参数的情况下,您必须编写自己的接口。@kritzikratzi谢谢,我在学校只在几门课上使用过java,我很幸运能记住这么多;)是和否。runnable是一个有具体用途的类。我更喜欢使用更通用的。在需要参数的情况下,您必须编写自己的接口。@kritzikratzi谢谢,我在学校只在几门课上使用过java,我很幸运能记住这么多;)