如何获取Java 8方法参考的MethodInfo?

请看下面的代码:

Method methodInfo = MyClass.class.getMethod("myMethod");

此方法有效,但是方法名称作为字符串传递,因此即使myMethod不存在,也可以编译。

另一方面,Java 8引入了方法引用功能。在编译时检查它。可以使用此功能获取方法信息吗?

printMethodName(MyClass::myMethod);

完整示例:

@FunctionalInterface

private interface Action {

void invoke();

}

private static class MyClass {

public static void myMethod() {

}

}

private static void printMethodName(Action action) {

}

public static void main(String[] args) throws NoSuchMethodException {

// This works, but method name is passed as a string, so this will compile

// even if myMethod does not exist

Method methodInfo = MyClass.class.getMethod("myMethod");

// Here we pass reference to a method. It is somehow possible to

// obtain java.lang.reflect.Method for myMethod inside printMethodName?

printMethodName(MyClass::myMethod);

}

换句话说,我想要一个等效于以下C#代码的代码:

    private static class InnerClass

{

public static void MyMethod()

{

Console.WriteLine("Hello");

}

}

static void PrintMethodName(Action action)

{

// Can I get java.lang.reflect.Method in the same way?

MethodInfo methodInfo = action.GetMethodInfo();

}

static void Main()

{

PrintMethodName(InnerClass.MyMethod);

}

回答:

没有可靠的,受支持的方式来执行此操作。你将方法引用分配给功能接口的实例,但是该实例是由编写的LambdaMetaFactory,无法深入到该实例中以查找最初绑定到的方法。

Java中的Lambda和方法引用的工作方式与C#中的委托完全不同。有关一些有趣的背景,请继续阅读invokedynamic

此处的其他答案和评论表明,通过其他一些工作,当前可能可以检索绑定方法,但是请确保你了解警告。

以上是 如何获取Java 8方法参考的MethodInfo? 的全部内容, 来源链接: utcz.com/qa/417227.html

回到顶部