当使用Lambda表达式时,Java实际上创建了一个匿名(非静态)类。 非静态内部类总是包含对其封闭对象的引用。
当从另一个库中调用此Lambda表达式时,可能会在不同进程中调用Lambda表达式,此时调用将崩溃并出现找不到类的异常,因为它无法在另一个进程中找到封闭对象的类。
考虑以下示例:
public class MyClass {
public void doSomething() {
remoteLambdaExecutor.executeLambda(value -> value.equals("test"));
}
}
Java会创建一个实现特定功能接口的匿名内部类,并将其作为参数传递给executeLambda()方法。然后,remoteLambdaExecutor将获取该匿名类并在远程进程中运行。 远程进程对MyClass一无所知,因此可能会抛出异常。
java.lang.ClassNotFoundException: MyClass
因为它需要MyClass来引用封闭对象。
我总是可以使用API期望的函数接口的静态实现,但这违背了本意并且没有利用lambda功能。
有没有办法使用lambda表达式来解决呢?
更新:除非将静态类以某种方式导出到其他进程中,否则我也无法使用静态类。