Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中传递任何方法作为参数的函数接口_Java_Methods_Lambda_Functional Programming - Fatal编程技术网

在Java中传递任何方法作为参数的函数接口

在Java中传递任何方法作为参数的函数接口,java,methods,lambda,functional-programming,Java,Methods,Lambda,Functional Programming,我正在尝试编写一个方法,它接受两个参数——一个类引用,一个类中方法的引用。方法本身的返回类型应该是该类的方法返回类型。例如: public <T> T myMethod (Class<?> c, <reference to a method m in class c>), where m returns something of type <T>. 请注意,SomeClass可以是任何类,someMethod可以是该类中具有任意数量参数的任何方法

我正在尝试编写一个方法,它接受两个参数——一个类引用,一个类中方法的引用。方法本身的返回类型应该是该类的方法返回类型。例如:

public <T> T myMethod (Class<?> c, <reference to a method m in class c>), where m returns something of type <T>.
请注意,SomeClass可以是任何类,someMethod可以是该类中具有任意数量参数的任何方法


我有理由相信,在Java8中使用lambda和函数接口是可能的,但不完全清楚如何使用它。

您试图做的事情不可能立即实现。也就是说,如果没有对方法的直接反射访问权,就不能引用该方法

实际上,myMethodMyClass.class,myClass->myClass.Hello绝对不是 解决任何问题的好办法。想想看,你在哪里需要这个?如果该方法是静态的,您可以以任何方式调用它,如果不是,您只需要一个实例

但是,您可以做的是找到您的方法并通过反射api调用它:

public Object myMethod(Class<?> clazz) {
    return clazz.getDeclaredMethod("name_of_method", ... /*Any parameters*/).invoke(/*params*/);
}

你想做的事不是马上就能做到的。也就是说,如果没有对方法的直接反射访问权,就不能引用该方法

实际上,myMethodMyClass.class,myClass->myClass.Hello绝对不是 解决任何问题的好办法。想想看,你在哪里需要这个?如果该方法是静态的,您可以以任何方式调用它,如果不是,您只需要一个实例

但是,您可以做的是找到您的方法并通过反射api调用它:

public Object myMethod(Class<?> clazz) {
    return clazz.getDeclaredMethod("name_of_method", ... /*Any parameters*/).invoke(/*params*/);
}

函数接口方法需要采用一个与命名类c相同类型的参数,因此您需要为该类定义一个泛型类型,让我们称之为c


函数接口方法需要返回类型为T的值,但可以将其重命名为R以表示返回类型

这意味着您的函数接口可以是:function

您的完整方法声明是:

public <C, R> R myMethod(Class<? extends C> clazz, Function<C, R> method)

函数接口方法需要采用一个与命名类c相同类型的参数,因此您需要为该类定义一个泛型类型,让我们称之为c


函数接口方法需要返回类型为T的值,但可以将其重命名为R以表示返回类型

这意味着您的函数接口可以是:function

您的完整方法声明是:

public <C, R> R myMethod(Class<? extends C> clazz, Function<C, R> method)

这没有道理。首先,你不能直接调用一个方法,除非它是静态的,在这种情况下这样做没有意义,或者你有一个实例。只有当方法本身是私有的时,这才有用,在这种情况下,使用反射是您唯一的选择为什么要这样做?也许有人可以提供一个更好的选择,有一些背景我将调用的方法不是静态的。我这样做是为了能够在不使用AOP或代理的情况下对所有这些方法执行通用操作。这没有意义。首先,你不能直接调用一个方法,除非它是静态的,在这种情况下这样做没有意义,或者你有一个实例。只有当方法本身是私有的时,这才有用,在这种情况下,使用反射是您唯一的选择为什么要这样做?也许有人可以提供一个更好的选择,有一些背景我将调用的方法不是静态的。我这样做是为了能够在不使用AOP或代理的情况下对所有这些方法执行普通操作。完美!正是我需要的。谢谢@Andreas.Perfect!正是我需要的。谢谢你,安德烈亚斯。