【发布时间】:2014-12-19 19:49:59
【问题描述】:
在 JDK 8 中,我可以使用反射来调用具有 FunctionalInterface 参数的方法,并传递一个 Lambda 表达式。例如,这是可行的。
import java.util.function.IntPredicate;
import java.lang.reflect.Method;
public class LambdaReflect {
public static void main(String args[]) {
System.out.println(test(x->true));
// Now do this in reflection
Class<LambdaReflect> thisC = LambdaReflect.class;
Method meths[] = thisC.getDeclaredMethods();
Method m = meths[1]; // test method
try {
IntPredicate lamb = x->true;
boolean result = (Boolean) m.invoke(null, lamb);
System.out.println(result);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static boolean test(IntPredicate func) {
return func.test(1);
}
}
但是,如果参数类型仅在运行时已知,我如何将 lambda 表达式传递给方法?也就是说,如果我在编译的时候不知道方法的参数类型,只知道它是一个函数式接口,我可以用反射用lambda表达式调用它吗?
【问题讨论】:
-
您能否澄清参数类型是否仅在运行时才知道?
-
我不太确定你想问什么。请说明您要做什么以及遇到问题的原因。
-
Method m = meths[1]; // test method不代表test(IntPredicate func)方法。您需要使用Method m = thisC.getDeclaredMethod("test", IntPredicate.class);之类的东西。您可以使此代码更具动态性,但为了更多地帮助您,我们需要准确了解您想要实现的目标以及在运行时您将拥有哪些数据。 -
顺便说一句,从不忽略异常,始终处理它们,即使只是简单地打印它们的堆栈跟踪。
-
@Bohemian 然后你假设了一个稍后可能会被重构的属性。始终针对签名和隐式合约进行编码,而不是针对实现细节。
标签: java reflection lambda