SerializedLambda — 람다 표현식의 직렬화된 형태
SerializedLambda — 람다 표현식의 직렬화된 형태
SerializedLambda는 **람다 표현식의 직렬화된 형태(serialized form)**예요. 이 클래스의 속성들은 람다 팩토리 사이트에 존재하는 정보를 나타내요.
본문
직렬화 가능한 람다를 구현하는 주체(컴파일러나 언어 런타임 라이브러리 등)는 인스턴스가 제대로 역직렬화되도록 보장해야 해요. 한 가지 방법은 기본 직렬화가 진행되도록 두지 않고, writeReplace 메서드가 SerializedLambda 인스턴스를 반환하게 하는 거예요.
SerializedLambda는 readResolve 메서드를 갖고 있는데, 캡처하는 클래스에서 $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로 속성을 조회할 수 있어요.