【问题标题】:Get closure information from Java functional interface [closed]从Java功能接口获取闭包信息[关闭]
【发布时间】:2017-07-26 18:12:24
【问题描述】:

我希望能够在运行时从 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, ... }

【问题讨论】:

  • 你认为你为什么需要这个?您实际上并没有在运行时传递 lambda 。这是一个和其他实例一样的实例。
  • 不确定我是否理解您要执行的操作。当你定义一个 lambda 时,它可能会记住它的上下文,如果你提供一个你想做的例子,我们可以提供帮助吗?
  • 我需要它,因为我想记录环境中的所有变量。请不要告诉我架构是错误的,我不否认,但有时有太多关键的事情捆绑在一起,我宁愿不去打扰它。
  • @Joe.b 我已经更新了问题
  • 这不是 lambda 的工作方式。这是经典的XY Problem

标签: java reflection lambda closures


【解决方案1】:

您可以使用反射从生成的 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));
    }
}

Ideone Demo

【讨论】:

  • 非常感谢!我同意这不是代码库中最好的东西,但在我找到更好的解决方案并实施之前,它会非常有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多