【发布时间】:2013-11-19 15:29:54
【问题描述】:
请看下面的代码:
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);
}
【问题讨论】:
-
看起来它毕竟是可能的,通过使用代理来记录哪个方法被调用。 stackoverflow.com/a/22745127/3478229
-
这是可能的,但这对代理类施加了限制。例如,它不能是最终的并且需要具有默认的公共或受保护的构造函数。此外,这不适用于 final 方法。
-
接受警告(我们无法区分 lambda,并且 lambda 可以包含欺骗我们的 IF),这是一种很好的方法,并且在 API 中很有用——如果你可以获取现成的 impl github.com/joj-io/joj-reflect/blob/master/src/main/java/io/joj/…希望。
-
我也一直想这样做。在大多数情况下,“正确”的做法是创建一个自定义注释并通过注释标记该方法,但这很快就会变得很麻烦。
-
How to get Method object in Java without using method string names 的可能重复项。它没有提到方法参考,但有几个合理的答案,不像这里的这个问题。
标签: java reflection lambda java-8