GuardedInvocation
GuardedInvocation (조건부 유효 메서드 핸들)
조건적으로 유효한 메서드 핸들을 나타내는 불변 클래스입니다. 보통 GuardingDynamicLinker.getGuardedInvocation(...)과 GuardingTypeConverterFactory.convertToType(...)의 반환값으로 만들어져요.
본문
GuardedInvocation은 여러 요소의 불변 튜플입니다. 호출 메서드 핸들, 그 호출 핸들이 적용 가능한지를 정의하는 가드 메서드 핸들, 호출 핸들의 외부 무효화에 쓸 수 있는 스위치 포인트(0개 이상), 그리고 이 타입의 예외가 호출 중 던져지면 역시 호출 핸들을 무효화하는 예외 타입으로 구성돼요.
호출 핸들은 가드 핸들이 인자에 대해 true를 반환하고, 어떤 스위치 포인트도 무효화되지 않았고, 지정된 타입의 예외를 던지지 않는 한 호출에 적합합니다. 가드·스위치 포인트·예외 타입은 모두 선택 사항이라, 셋 다 없는 가드된 호출은 무조건적으로 유효합니다.
생성자
GuardedInvocation(MethodHandle invocation)— 무조건 유효한 가드된 호출을 만듭니다.GuardedInvocation(MethodHandle invocation, MethodHandle guard)— 가드 메서드 핸들을 가진 가드된 호출을 만듭니다.GuardedInvocation(MethodHandle invocation, SwitchPoint switchPoint)— 스위치 포인트로 무효화될 수 있는 가드된 호출을 만듭니다.GuardedInvocation(MethodHandle invocation, MethodHandle guard, SwitchPoint switchPoint)— 가드와 스위치 포인트를 모두 가진 호출입니다.GuardedInvocation(MethodHandle invocation, MethodHandle guard, SwitchPoint switchPoint, Class<? extends Throwable> exception)— 가드, 스위치 포인트, 예외 타입을 모두 갖춘 호출입니다.GuardedInvocation(MethodHandle invocation, MethodHandle guard, SwitchPoint[] switchPoints, Class<? extends Throwable> exception)— 스위치 포인트를 여러 개 받는 오버로드입니다.
주요 메서드
addSwitchPoint(SwitchPoint)— 스위치 포인트 하나를 추가한 새 가드된 호출을 만듭니다.asType(MethodType)— 호출과 (있다면) 가드의 타입을MethodHandle.asType처럼 변경합니다.asType(CallSiteDescriptor)/asType(LinkerServices, MethodType)— 콜 사이트 설명자나 링커 서비스를 이용해 호출 타입을 변경합니다.asTypeSafeReturn(LinkerServices, ...)— 반환 타입 변환이 안전한 방식으로 타입을 변경합니다.- 그 외 스위치 포인트·가드·예외를 조회하는
getSwitchPoints(),getGuard(),getException()같은 접근자와hasGuard(),hasSwitchPoints()같은 판별 메서드도 있습니다.
이 객체는 링크 과정의 핵심 산출물이라서, 여러 링커 파이프라인을 거치며 가드·스위치 포인트·예외를 추가로 덧붙여 가는 구조로 쓰여요. 덕분에 최초 연결부터 최종 타깃 확정까지 조건이 점진적으로 강화되는 흐름을 깔끔하게 담아낼 수 있어요.