MethodType — 메서드 핸들이 받고 반환하는 타입

MethodType — 메서드 핸들이 받고 반환하는 타입

MethodType는 메서드 핸들이 받아들이고 반환하는 인자와 리턴 타입을 나타내요. 메서드 핸들과 그 모든 호출자 사이에서 메서드 타입이 올바르게 맞아야 하며, JVM의 연산이 특히 MethodHandle.invokeExact·MethodHandle.invoke 호출 중과 invokedynamic 명령어 실행 중에 이 매칭을 강제해요.

출처: Java API Reference

본문

구조는 리턴 타입과 임의 개수의 파라미터 타입으로 이루어져요. 타입(원시·void·참조)은 Class 객체로 표현돼요. (설명의 편의상 void를 타입처럼 다루지만, 사실 void는 리턴 타입이 없음을 뜻해요.)

모든 MethodType 인스턴스는 불변(immutable) 이에요. 두 인스턴스가 같게 비교되면 완전히 상호 교환 가능하고, 동등성은 리턴·파라미터 타입의 쌍별 대응에만 의존하며 그 외의 것은 신경 쓰지 않아요.

이 타입은 팩토리 메서드로만 생성할 수 있어요. 모든 팩토리 메서드가 값을 캐시할 수 있지만 보장되지는 않아요. 일부 팩토리 메서드는 static이고, 다른 것들은 선택된 파라미터를 바꾸는 등 이전 메서드 타입을 수정하는 가상 메서드예요.

파라미터 타입 그룹에 동작하는 팩토리 메서드는 자바 배열과 자바 리스트 모두로 파라미터 타입 그룹을 다룰 수 있도록 두 가지 버전으로 체계적으로 제공돼요. 조회 메서드 parameterArray·parameterList도 배열과 리스트 선택지를 제공해요.

MethodType 객체는 때때로 invokedynamic 같은 바이트코드 명령어에서 파생되는데, 구체적으로는 클래스 파일 상수 풀에서 그 명령어와 연결된 타입 설명자 문자열에서 유래해요. 클래스·문자열처럼 메서드 타입도 클래스 파일 상수 풀에서 상수로 직접 표현될 수 있어요. ldc 명령어가 적절한 CONSTANT_MethodType 상수 풀 항목을 참조해 메서드 타입을 로드할 수 있어요.

상속 구조는 다음과 같아요.

java.lang.Object
  java.lang.invoke.MethodType

Serializable, Constable, TypeDescriptor.OfMethod<Class<?>,MethodType>을 구현하는 final 클래스예요.

주요 용도

메서드 핸들을 만들 때 타입을 명시하는 데 쓰이며, MethodHandles.lookup().findStatic/... 같은 API에서 MethodType.methodType(...) 형태로 자주 사용돼요.

더 알아보기 (Learn more)