MethodHandle — 메서드·생성자·필드를 가리키는 타입 있는 직접 실행 참조

MethodHandle — 메서드·생성자·필드를 가리키는 타입 있는 직접 실행 참조

MethodHandle은 밑바탕 메서드·생성자·필드 또는 비슷한 저수준 연산에 대한 타입이 있는, 직접 실행 가능한 참조예요. 인자나 반환 값에 선택적인 변환(transformation)을 적용할 수 있어요. 이 변환은 꽤 일반적이어서 변환(conversion)·삽입(insertion)·삭제(deletion)·치환(substitution) 같은 패턴을 포함해요.

출처: Java API Reference

본문

메서드 핸들의 내용

메서드 핸들은 파라미터·반환 타입에 따라 동적이면서 강하게 타입이 정해져 있어요. 밑바탕 메서드의 이름이나 정의 클래스로 구별되지는 않아요. 메서드 핸들은 자신의 타입 설명자와 일치하는 기호 타입 설명자로 호출되어야 해요.

모든 메서드 핸들은 type 접근자로 자기 타입 설명자를 보고해요. 이 타입 설명자는 MethodType 객체인데, 구조가 클래스들의 연속이며 그중 하나가 메서드의 반환 타입(없으면 void.class)이에요. 메서드 핸들의 타입은 감당하는 호출 타입들과 적용되는 변환 종류를 제어해요.

메서드 핸들은 invokeExactinvoke라는 두 특별한 invoker 메서드를 포함해요. 둘 다 인자·반환 값의 변환으로 수정된 밑바탕 메서드·생성자·필드·기타 연산에 직접 접근할 수 있게 해 줘요. 두 invoker 모두 메서드 핸들 자신의 타입과 정확히 일치하는 호출을 받아들여요. 평범한(비정확한) invoker invoke는 그 외의 다양한 호출 타입도 받아들여요.

메서드 핸들은 불변(immutable) 이며 눈에 보이는 상태가 없어요. 물론 상태를 보이는 밑바탕 메서드나 데이터에 바인딩될 수는 있어요. 자바 메모리 모델에 관해 어떤 메서드 핸들도 (내부) 필드 전부가 final 변수인 것처럼 동작해요.

핵심 용어

  • 직접 메서드 핸들(direct method handle): 메서드·생성자·필드를 중간 바인딩·변환 없이 나타내요.
  • 타입 변환(asType): 메서드 핸들의 타입을 새 타입으로 적응시키는 변환을 적용해요.
  • 바인딩(bindTo): 인자 하나를 메서드 핸들에 바인딩해 그 인자를 미리 고정해요.

주요 메서드

  • Object invokeExact(Object... args) throws Throwable — 정확한 타입 일치가 요구되는 호출이에요.
  • Object invoke(Object... args) throws Throwable — 비정확한 호출로, 타입 적응 변환이 허용돼요.
  • MethodType type() — 메서드 핸들의 타입을 반환해요.
  • MethodHandle asType(MethodType newType) — 이 메서드 핸들을 새 타입에 적응시켜 반환해요.
  • MethodHandle bindTo(Object x) — 이 메서드 핸들의 첫 인자에 값을 바인딩한 메서드 핸들을 반환해요.
  • Object invokeWithArguments(Object... arguments) — 인자를 넣어 호출하고 결과를 반환해요.

abstract sealed class라서 사용자가 직접 상속할 수는 없고, Constable을 구현해요. 자바 1.7부터 제공돼요.

더 알아보기 (Learn more)