MethodHandles — 메서드 핸들을 다루는 static 메서드 모음
MethodHandles — 메서드 핸들을 다루는 static 메서드 모음
MethodHandles는 메서드 핸들에 대해 동작하거나 메서드 핸들을 반환하는 static 메서드들로만 이루어진 클래스예요. 메서드들은 다음과 같은 범주로 나뉘어요.
본문
- 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을 고르는 메서드 핸들을 만들어요.