ConstantCallSite — 타깃을 바꿀 수 없는 콜 사이트
ConstantCallSite — 타깃을 바꿀 수 없는 콜 사이트
ConstantCallSite는 타깃이 영구적이고 절대 변경될 수 없는 CallSite예요. ConstantCallSite에 연결된 invokedynamic 명령어는 콜 사이트의 타깃에 영구적으로 묶여요.
본문
변경 가능한 타깃이 필요 없다면 콜 사이트를 상수로 만들어 버리는 게 가장 간단하고 성능도 좋아요. Ry 계열에서 타깃을 아예 바꾸지 않을 것이 확실한 경우에 이 클래스를 써요.
상속 구조는 다음과 같아요.
java.lang.Object
java.lang.invoke.CallSite
java.lang.invoke.ConstantCallSite
생성자
ConstantCallSite(MethodHandle target)— 영구 타깃으로 콜 사이트를 만들어요.target이 null이면NullPointerException을 던져요.protected ConstantCallSite(MethodType targetType, MethodHandle createTargetHook) throws Throwable— 영구 타깃으로, 콜 사이트 자체에 묶일 수 있는 콜 사이트를 만들어요. 생성 중createTargetHook.invoke(this)형태로 훅이 호출돼 실제 타깃을 생성해요. 사용자 코드는ConstantCallSite생성자가 반환되기 전에 타깃이 고정돼야 하므로 하위 클래스 생성자에서 직접 이런 동작을 할 수 없어요. 전형적인 동작은someTarget.bindTo(this)지만, 훅은 콜 사이트를 무시하고 상수 타깃을 반환하는 등 어떤 동작이든 할 수 있어요.
메서드
final MethodHandle dynamicInvoker()— 이 콜 사이트의 영구 타깃을 반환해요.final MethodHandle getTarget()— 콜 사이트의 타깃 메서드를 반환해요.ConstantCallSite의 final 필드처럼 동작해요.final void setTarget(MethodHandle ignore)— 항상UnsupportedOperationException을 던져요. 상수 콜 사이트의 타깃은 바꿀 수 없으니까요.