MissingMemberHandlerFactory

MissingMemberHandlerFactory (누락 멤버 처리 핸들러 팩토리)

BeansLinker에서 누락된 멤버(프로퍼티·메서드·요소)에 대한 동작을 연결하기 위한 메서드 핸들을 만드는 팩토리 인터페이스입니다. 함수형 인터페이스라 람다나 메서드 참조로 쓸 수 있어요.

출처: Java API Reference

본문

BeansLinker는 요청된 멤버가 누락되었을 것이 확실하거나 가능성이 있을 때, GET_*SET_* 계열의 StandardOperation 링크 요청에 대해 이 팩토리가 만든 메서드 핸들을 가드된 호출에 연결합니다. 이름이 있는 연산과 없는 연산 모두에 연결돼요.

구현자는 반환한 메서드 핸들의 매개변수 타입이 링크 요청에 기술된 콜 사이트의 매개변수 타입과 일치하도록 해야 합니다. 반환 타입은 달라도 되는데, DynamicLinkerFactory.setPrelinkTransformer(...)의 지연 반환 타입 변환을 허용하기 위해서예요. 기본 동작으로 충분하다면 메서드 핸들 대신 null을 반환해도 됩니다.

기본 누락 멤버 동작

BeansLinker가 누락 멤버 핸들러 팩토리 없이 설정되었거나, 팩토리가 특정 핸들러 생성 호출에 대해 null을 반환하면 기본 동작이 사용됩니다. 기본 동작은 링크 시점에 연결된 연산이 기존 멤버를 결코 가리키지 않을 것임을 판단할 수 있을 때 BeansLinker.getGuardedInvocation(...)에서 null을 반환하는 것입니다. 그러면 DynamicLinker가 다음 링커를 시도하고, 최종적으로 NoSuchDynamicMethodException으로 링크 요청을 실패 처리해요. 다른 경우(주로 이름 없는 멤버 연산과 컬렉션 요소에 대한 대부분의 이름 있는 연산)에는 런타임에 어떤 멤버와도 일치하지 않는 이름으로 호출되면 게터는 null을 반환하고 세터는 전달된 값을 조용히 무시하는 조건부 연결을 만듭니다.

예외를 던지는 동작 구현

이 인터페이스를 사용하면 누락 멤버에 대한 처리를 언어의 의미론에 맞게 바꿀 수 있습니다. 예를 들어 어떤 언어에서는 존재하지 않는 프로퍼티를 읽으면 예외를 던지는 것이 자연스럽겠지만, 다른 언어에서는 null을 반환하거나 기본 값을 돌려주는 것이 더 적절할 수 있어요.

특히 주의할 점은 누락 멤버 연결이 종종 조건부라는 것입니다. 그래서 팩토리는 그 자체로 예외를 던지기보다, 호출 시점에 예외를 던지는 메서드 핸들을 만들어 반환해야 해요. 그래야 조건이 맞지 않을 때는 그 핸들이 호출되지 않고 다른 경로로 처리될 수 있습니다.

메서드

  • createMissingMemberHandler(LinkRequest linkRequest, LinkerServices linkerServices) — 특정 링크 요청에 대해 누락 멤버 동작을 구현하기에 알맞은 메서드 핸들을 반환합니다. 연산이 가리키는 프로퍼티·요소·메서드가 없을 때 호출할 수 있는 핸들을 돌려주고, 없으면 null일 수 있어요. 어떤 이유로든 실패하면 Exception을 던질 수 있습니다.

더 알아보기

Java 공식 API