TypeBasedGuardingDynamicLinker
TypeBasedGuardingDynamicLinker (타입 기반 가드형 동적 링커)
링크 호출 시점에 첫 번째 인자(보통 리시버)의 타입만으로 콜 사이트를 연결할 수 있는지 판단할 수 있는 가드형 동적 링커입니다. 대부분의 언어별 링커가 이 범주에 속해요.
본문
언어별 링커들은 자신의 네이티브 객체가 특정 언어 네이티브 인터페이스나 슈퍼클래스를 구현한 자바 객체로 인식되기 때문에, 리시버 타입만 보고 연결 가능 여부를 빠르게 판단할 수 있어요. 첫 인자가 자기가 아는 타입인지만 확인하면 되기 때문입니다.
링커 메커니즘은 이런 타입 기반 링커들에 대해 디스패치를 최적화할 수 있는데, 그 방법은 CompositeTypeBasedGuardingDynamicLinker에 설명되어 있습니다. 여러 타입 기반 링커를 묶어 클래스별로 연결할 수 있는 링커를 캐싱해 디스패치를 빠르게 만드는 구조예요.
메서드
canLinkType(Class<?> type)— 첫 번째 인자(리시버)가 지정한 타입인 호출을 이 링커가 연결할 수 있으면true, 아니면false를 반환합니다.
이 인터페이스는 GuardingDynamicLinker를 확장하므로 getGuardedInvocation(...) 메서드도 함께 상속받아 구현해야 해요. 보통은 canLinkType이 true를 반환하는 타입에 대해서만 연결을 시도하는 구조로 만듭니다.
이렇게 타입만으로 연결 가능 여부를 판별할 수 있는 링커는 CompositeTypeBasedGuardingDynamicLinker에 담겨 함께 동작할 때 그 힘을 발휘합니다. 리시버 타입별로 연결할 수 있는 링커들을 미리 분류해 두고, 호출이 들어올 때 빠르게 맞는 링커를 찾아주는 방식이에요.
대부분의 언어별 링커는 이 범주에 속하므로, 이 인터페이스는 Dynalink에서 아주 흔히 쓰이는 패턴입니다. 직접 구현할 때는 canLinkType이 true를 반환하는 타입에 대해서만 연결을 시도하도록 만드는 것이 일반적이에요.