MethodHandles — 메서드 핸들을 다루는 static 메서드 모음

MethodHandles — 메서드 핸들을 다루는 static 메서드 모음

MethodHandles는 메서드 핸들에 대해 동작하거나 메서드 핸들을 반환하는 static 메서드들로만 이루어진 클래스예요. 메서드들은 다음과 같은 범주로 나뉘어요.

출처: Java API Reference

본문

  • Lookup 메서드 — 메서드와 필드를 위한 메서드 핸들을 만드는 데 도움을 줘요.
  • Combinator(조합) 메서드 — 기존 메서드 핸들을 결합하거나 변환해 새 메서드 핸들로 만들어요.
  • 기타 팩토리 메서드 — 다른 공통 JVM 연산이나 제어 흐름 패턴을 흉내 내는 메서드 핸들을 만들어요.

lookup·combinator·factory 메서드는 만들 메서드 핸들의 타입에 파라미터가 너무 많으면 IllegalArgumentException을 던지며 실패할 수 있어요.

java.lang.invoke 패키지에서 가장 널리 쓰이는 클래스로, 메서드 핸들 프로그래밍의 중심 역할을 해요. 자바 1.7부터 제공돼요.

중첩 클래스

  • MethodHandles.Lookup — 접근 검사가 필요한 상황에서 메서드 핸들을 만들기 위한 팩토리 객체예요. MethodHandles.lookup()으로 얻고, findStatic·findVirtual·findConstructor·findGetter·findSetter·unreflect 등으로 메서드 핸들을 만들어요.

주요 static 메서드 (일부)

  • Lookup lookup() — 호출 메서드의 lookup 객체를 반환해요.
  • MethodHandle arrayConstructor(Class<?> arrayClass) — 원하는 타입의 배열을 생성하는 메서드 핸들을 만들어요 (anewarray 바이트코드처럼).
  • MethodHandle arrayElementGetter(Class<?> arrayClass) — 배열 요소의 읽기 접근을 주는 메서드 핸들을 만들어요 (aaload처럼).
  • MethodHandle arrayElementSetter(Class<?> arrayClass) — 배열 요소의 쓰기 접근을 주는 메서드 핸들을 만들어요 (astore처럼).
  • VarHandle arrayElementVarHandle(Class<?> arrayClass)arrayClass 타입 배열의 요소에 접근하는 VarHandle을 만들어요.
  • MethodHandle arrayLength(Class<?> arrayClass) — 배열 길이를 반환하는 메서드 핸들을 만들어요.
  • MethodHandle identity(Class<?> type) — 인자를 그대로 반환하는 메서드 핸들을 만들어요.
  • MethodHandle constant(Class<?> type, Object value) — 호출 시 항상 상수 값을 반환하는 메서드 핸들을 만들어요.
  • MethodHandle filterReturnValue(MethodHandle target, MethodHandle filter) — target의 반환 값을 filter에 통과시켜 반환하는 메서드 핸들을 만들어요.
  • MethodHandle insertArguments(MethodHandle target, int pos, Object... values) — 특정 위치에 인자를 삽입한 메서드 핸들을 만들어요.
  • MethodHandle permuteArguments(MethodHandle target, MethodType newType, int... reorder) — 인자의 순서를 바꾸는 메서드 핸들을 만들어요.
  • MethodHandle dropArguments(MethodHandle target, int pos, List<Class<?>> valueTypes) — 인자를 버리는 메서드 핸들을 만들어요.
  • MethodHandle catchException(MethodHandle target, Class<? extends Throwable> exType, MethodHandle handler) — 예외를 잡아 핸들러로 처리하는 메서드 핸들을 만들어요.
  • MethodHandle guardWithTest(MethodHandle test, MethodHandle target, MethodHandle fallback) — 테스트 결과로 target/falback을 고르는 메서드 핸들을 만들어요.

더 알아보기 (Learn more)