当前位置: 首页 > 面试题库 >

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

鲁峰
2023-03-14
问题内容

请看下面的代码:

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

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



 类似资料:
  • 我阅读了关于Lambda表达式的Java 8教程,但不太了解“引用特定类型的任意对象的实例方法”的方法引用示例 在同一教程中,有一个示例“引用特定对象的实例方法”,看起来像。 我可以看到这个工作,因为方法compareByName与Comparator.comparelambda(a, b)具有相同的签名- 现在“引用特定类型的任意对象的实例方法”示例使用String::compareToIgno

  • 问题内容: 鉴于函数: 如何提取参数的数量和名称。即,鉴于我有提及func,因此我希望返回。 为此的使用场景是,我有一个装饰器,并且希望以与实际函数作为键一样的顺序使用方法参数。即,我打电话时装饰器的外观如何? 问题答案: 看一下模块-这将为你检查各种代码对象属性。 其他结果是 args和* kwargs变量的名称,以及提供的默认值。即。 请注意,在某些Python实现中,某些可调用对象可能不是自

  • 问题内容: Java8中是否有一种方法可以将方法引用用作对象来使用其方法,例如: 这个问题与无关,仅作为示例,我想对方法参考有答案 问题答案: 您可以编写一个静态方法来执行此操作: 然后,您可以将其放在实用程序类中并静态导入。 或者,创建一个更简单的静态方法,该方法 只 返回给定的函数,以使编译器知道您在做什么:

  • 问题内容: 我正在使用带有过滤器的ng-repeat指令,如下所示: 我可以看到渲染结果很好;现在我想在控制器上对该结果运行一些逻辑。问题是如何获取结果项引用? 更新: 只是为了澄清一下:我正在尝试创建自动完成功能,我有以下输入内容: 然后过滤的结果: 现在我要浏览结果并选择其中一项。 问题答案: 更新 :这是一种比以前更简单的方法。 然后是可访问的。

  • 两者都是具有相同签名的实例方法。为什么一个有效,另一个无效?

  • 问题内容: 我正在使用Twitter4J。但是我要问的问题比较笼统。我想访问给定推文的用户ID。目前,我有以下两种选择: 我不喜欢第一个选项中的lambda表达式,也不喜欢在第二个选项中被迫调用两个。有没有办法建立方法引用链?我知道这行不通,但是我想知道是否还有其他选择。 问题答案: 不,这是两种方法。其他任何事情最终都只会变得不清楚。 但是,自您提出要求以来,这里有一些选择。 要么