从Java函数接口获取闭包信息

从Java函数接口获取闭包信息,java,reflection,lambda,closures,Java,Reflection,Lambda,Closures,我希望能够在运行时从Java功能接口访问闭包环境信息。例如,我将lambda,比如,(输入)->input+knownVariable传递给函数lambdaProcessor 现在,在lambdaProcessor中,我希望能够访问与此lambda关联的环境,并获取存储在此环境中的所有变量的值 这可能吗?我不介意创建自己的功能界面,或者使用反射等 我希望最终输出类似于变量名->值/地址的映射。所以我应该能够做到这一点: void lambdaProcessor(FunctionalInterfa

我希望能够在运行时从Java功能接口访问闭包环境信息。例如,我将lambda,比如,
(输入)->input+knownVariable
传递给函数
lambdaProcessor

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

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

我希望最终输出类似于
变量名->值/地址的映射。所以我应该能够做到这一点:

void lambdaProcessor(FunctionalInterfaceInstance l) {
    System.out.println(l.getEnvironment());
}
它应该打印出来

{"knownVariable": 10, ... }
或者,即使它不存储变量名,只存储某种标记,我仍然希望

{"reference1": 10, ... }

您可以使用反射从生成的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));
    }
}
静态无效打印捕获(函数f)引发异常{
System.out.println(f.getClass());
对于(字段:f.getClass().getDeclaredFields()){
字段。setAccessible(true);
System.out.println(field.getName()+”:“+field.get(f));
}
}

你认为你为什么需要这个?实际上,在运行时并没有传递lambda。这是一个和其他例子一样的例子。我不知道你想做什么。当你定义一个lambda时,它会记住它的上下文,如果你提供一个例子,说明你要做什么,我们可以提供帮助吗?我需要它,因为我想记录环境中的所有变量。请不要告诉我架构是错误的,我不否认这一点,但有时有太多关键的东西绑在一起,我宁愿不去打扰它们。@Joe.b我更新了这个问题,这不是lambdas的工作方式。这是一部经典之作。非常感谢!我同意这不是代码库中最好的东西,但在我找到更好的解决方案并实现它之前,它将非常有用。