GuardingDynamicLinker

GuardingDynamicLinker (언어별 동적 링커 인터페이스)

언어별 동적 링커를 위한 기본 인터페이스입니다. 이런 링커는 반드시 가드가 있는 메서드 핸들을 만들어야 하는데, 콜 사이트에서의 호출에 대한 메서드 핸들의 유효성이 어쨌든 어떤 조건(최소한 리시버가 그 링커의 언어 런타임에 속한다는 조건)에 의존하기 때문이에요.

출처: Java API Reference

본문

언어 런타임 구현자는 보통 자신의 언어를 위한 연결 로직을 하나 이상의 GuardingDynamicLinker 클래스로 작성합니다. 그리고 이들을 자신이 설정한 DynamicLinkerFactory의 우선순위 링커로 등록하고, 언어별 '프로퍼티를 찾지 못함' 같은 조건을 처리할 폴백 링커도 설정하곤 해요.

객체의 자바 클래스에 기반한 링커라면 이 인터페이스 대신 TypeBasedGuardingDynamicLinker 구현을 고려하세요. 언어별 타입 변환이 필요하다면 GuardingDynamicLinkerGuardingTypeConverterFactory도 함께 구현하게 하면 됩니다. 언어는 GuardingDynamicLinkerExporter를 사용해 다른 언어 런타임에 링커를 노출해 자동 발견되게 할 수 있어요.

메서드

  • getGuardedInvocation(LinkRequest linkRequest, LinkerServices linkerServices) — 콜 사이트에서 지정한 인자로 특정 호출에 알맞은 가드된 호출을 만듭니다. 인자에 적합한 메서드 핸들과, 실패 시 재연결을 일으켜야 하는 가드 조건을 가진 호출을 반환하며, 호출을 해석할 수 없으면 null을 돌려줘야 해요.

반환된 호출이 무조건적이라면 가드는 null일 수 있습니다. 호출은 비동기 무효화를 위한 임의 개수의 스위치 포인트와, 재연결을 일으키는 예상 예외 조건을 기술하는 Throwable 하위 타입도 가질 수 있어요. 링커는 콜 사이트 설명자의 매개변수 타입과 일치하는 호출을 만들어야 하지만, 정밀도나 크기를 잃지 않는 변환으로만 가능한 경우가 아니라면 반환 타입을 맞추려 시도하지 않아도 됩니다. 어떤 이유로든 실패하면 Exception을 던질 수 있어요.

이 인터페이스를 구현할 때는 가드 조건을 어떻게 설계할지가 핵심입니다. 가드가 자주 실패하면 재연결이 잦아져 성능이 떨어질 수 있고, 너무 느슨하면 잘못된 타깃에 연결되어 런타임 오류가 나니까요.

필요한 경우 instanceof 검사보다 자주 발생하는 ClassCastException에 기대는 편이 더 빠를 때가 있습니다. 가드는 성능과 정확성 사이의 균형을 맞추는 요소라서, 호출 빈도가 높은 경로일수록 가드 비용을 신경 써야 해요.

더 알아보기

Java 공식 API