从Java功能接口

时间:2017-07-26 18:12:24

标签: java reflection lambda closures

我希望能够在Java功能界面上访问运行​​时的闭包环境信息。例如,我将lambda传递给函数(input) -> input + knownVariable,例如lambdaProcessor

现在,从lambdaProcessor开始,我希望能够访问与此lambda相关联的环境,并获取存储在此环境中的所有变量的值。

这可能吗?我不介意创建自己的功能界面,或使用反射等。

我希望最终输出类似于variable name -> value/address的地图。所以我应该能够做到这一点:

void lambdaProcessor(FunctionalInterfaceInstance l) {
    System.out.println(l.getEnvironment());
}

它应该打印出来

{"knownVariable": 10, ... }

即使它不存储变量名称而只存储某种标记,我仍然喜欢

{"reference1": 10, ... }

1 个答案:

答案 0 :(得分:2)

您可以使用反射从生成的lambda类中检索捕获的变量。请注意,这非常脆弱,因为lambda类结构未指定并且可以随时更改(或者甚至可能不存在)。例如:

static void printCaptures(Function<Integer, String> f) throws Exception {
    System.out.println(f.getClass());
    for (Field field : f.getClass().getDeclaredFields()) {
        field.setAccessible(true);
        System.out.println(field.getName() + ": " + field.get(f));
    }
}

here