SerializedLambda — 람다 표현식의 직렬화된 형태

SerializedLambda — 람다 표현식의 직렬화된 형태

SerializedLambda는 **람다 표현식의 직렬화된 형태(serialized form)**예요. 이 클래스의 속성들은 람다 팩토리 사이트에 존재하는 정보를 나타내요.

출처: Java API Reference

본문

직렬화 가능한 람다를 구현하는 주체(컴파일러나 언어 런타임 라이브러리 등)는 인스턴스가 제대로 역직렬화되도록 보장해야 해요. 한 가지 방법은 기본 직렬화가 진행되도록 두지 않고, writeReplace 메서드가 SerializedLambda 인스턴스를 반환하게 하는 거예요.

SerializedLambdareadResolve 메서드를 갖고 있는데, 캡처하는 클래스에서 $deserializeLambda$(SerializedLambda)라는 (private일 수 있는) static 메서드를 찾아, 자신을 첫 인자로 그 메서드를 호출하고 그 결과를 반환해요. $deserializeLambda$를 구현하는 람다 클래스는 SerializedLambda의 속성들이 실제로 그 클래스가 캡처한 람다와 일관되는지 검증할 책임이 있어요.

직렬화된 형태를 역직렬화해서 만든 함수 객체의 정체성(identity)은 예측할 수 없어요. 그래서 참조 동등성, 객체 잠금, System.identityHashCode() 같은 정체성에 민감한 연산은 구현에 따라, 또는 같은 구현에서도 역직렬화 횟수에 따라 다른 결과를 낼 수 있어요.

상속 구조는 다음과 같아요.

java.lang.Object
  java.lang.invoke.SerializedLambda

Serializable을 구현하는 final 클래스예요.

생성자

  • SerializedLambda(Class<?> capturingClass, String functionalInterfaceClass, String functionalInterfaceMethodName, String functionalInterfaceMethodSignature, int implMethodKind, String implClass, String implMethodName, String implMethodSignature, String instantiatedMethodType, Object[] capturedArgs) — 람다 팩토리 사이트에 존재하는 저수준 정보로부터 SerializedLambda를 만들어요.

키 메서드

  • Object getCapturedArg(int i) — 람다 캡처 사이트의 dynamic 인자를 가져와요.
  • int getCapturedArgCount() — 캡처된 인자의 개수를 반환해요.
  • 필요한 경우 getCapturingClass(), getFunctionalInterfaceClass(), getImplMethodName() 등의 getter로 속성을 조회할 수 있어요.

더 알아보기 (Learn more)