大佬教程收集整理的这篇文章主要介绍了Java 8:将lambda转换为包含闭包的Method实例,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
如果您找不到优雅的方法,这就是丑陋的方法(IDeone)。涉及反射时通常会发出警告:在将来的发行版中可能会中断
public static voID main(String[] args) throws Exception {
Function<String, String> sayHello = name -> "Hello, " + name;
Method m = getmethodFromLambda(sayHello);
registerFunction("World", m);
}
static voID registerFunction(String name, Method method) throws Exception {
String result = (String) method.invoke(null, Name);
System.out.println("result = " + result);
}
private static Method getmethodFromLambda(Function<String, String> lambda) throws Exception {
Constructor<?> c = Method.class.getDeclaredConstructors()[0];
c.setAccessible(true);
Method m = (Method) c.newInstance(null, null, null, null, null, 0, 0, null, null, null, null);
m.setAccessible(true); //sets overrIDe fIEld to true
//m.methodAccessor = new LambdaAccessor(...)
FIEld ma = Method.class.getDeclaredFIEld("methodAccessor");
ma.setAccessible(true);
ma.set(m, new LambdaAccessor(array -> lambda.apply((String) array[0])));
return m;
}
static class LambdaAccessor implements MethodAccessor {
private final Function<Object[], Object> lambda;
public LambdaAccessor(Function<Object[], Object> lambda) {
this.lambda = lambda;
}
@OverrIDe public Object invoke(Object o, Object[] os) {
return lambda.apply(os);
}
}
(这很难搜索,因为结果全都与“方法参考”有关)
我想获取一个Methodlambda表达式的实例,以与基于传统反射的API一起使用。应该包括clousure,因此调用thatMethod.invoke(null,...)
应与调用lambda具有相同的效果。
我已经看过@H_122_5@methodHandles.Lookup,但是它似乎只与反向转换有关。但是我想该bind方法可能有助于包括clousure?
编辑:
假设我有lambda扩展功能:
Function<String,String> sayHello = name -> "Hello," + name;
我有一个遗留框架(SpEL),其API
registerFunction(String name,Method method)
这将Method不带任何this参数调用给定值(即,方法假定为静态)。因此,我需要获得一个Method包含lambda逻辑+ clousure数据的特殊实例。
以上是大佬教程为你收集整理的Java 8:将lambda转换为包含闭包的Method实例全部内容,希望文章能够帮你解决Java 8:将lambda转换为包含闭包的Method实例所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。