Java 8:将lambda转换为包含闭包的Method实例

发布于 2021-01-29 20:16:15

(这很难搜索,因为结果全都与“方法参考”有关)

我想获取一个Methodlambda表达式的实例,以与基于传统反射的API一起使用。应该包括clousure,因此调用thatMethod.invoke(null, ...)应与调用lambda具有相同的效果。

我已经看过MethodHandles.Lookup,但是它似乎只与反向转换有关。但是我想该bind方法可能有助于包括clousure?

编辑:

假设我有lambda扩展功能:

Function<String, String> sayHello = name -> "Hello, " + name;

我有一个遗留框架(SpEL),其API

registerFunction(String name, Method method)

这将Method不带任何this参数调用给定值(即,方法假定为静态)。因此,我需要获得一个Method包含lambda逻辑+ clousure数据的特殊实例。

关注者
0
被浏览
476
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果您找不到优雅的方法,这就是丑陋的方法(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);
      }
    }
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看