MethodHandleProxies — 메서드 핸들을 다른 JVM 타입에 적응시키는 static 메서드 모음
MethodHandleProxies — 메서드 핸들을 다른 JVM 타입에 적응시키는 static 메서드 모음
MethodHandleProxies는 메서드 핸들을 인터페이스 같은 다른 JVM 타입에 적응시키는 데 도움을 주는 static 메서드들로만 이루어진 클래스예요.
본문
메서드 핸들은 자바 타입이 아니라서, 인터페이스가 필요한 곳(예: 콜백으로 받는 API)에 그대로 넘길 수 없어요. asInterfaceInstance로 메서드 핸들을 단일 메서드 인터페이스의 인스턴스로 감싸면, 그 인터페이스를 요구하는 코드에 넘길 수 있어요.
static 메서드
static <T> T asInterfaceInstance(Class<T> intfc, MethodHandle target)— 주어진 단일 메서드 인터페이스의 인스턴스를 만들어, 그 호출을 주어진 메서드 핸들로 리다이렉트해요.- 단일 메서드 인터페이스는 고유하게 이름 붙은 메서드를 선언하는 인터페이스예요. 고유 메서드를 판별할 때
Object의 public 메서드(toString,equals,hashCode)와 default(비추상) 메서드는 무시돼요. 예를 들어Comparator는Object.equals를 다시 선언하고Comparator.reverse같은 default 메서드도 선언하지만, 여전히 단일 메서드 인터페이스예요. - 인터페이스는 public이고 sealed가 아니어야 해요. 추가 접근 검사는 수행되지 않아요.
- 결과 인스턴스는 그 타입의 고유 메서드를 호출하면 들어온 인자로 주어진 target을 호출하고, target이 반환하거나 던지는 것을 그대로 반환·던져요. 호출은
target.invoke처럼 동작해요. 인스턴스가 만들어지기 전에 target의 타입이asType호출처럼 검사돼서, 타입이 안 맞으면WrongMethodTypeException이 나올 수 있어요.
- 단일 메서드 인터페이스는 고유하게 이름 붙은 메서드를 선언하는 인터페이스예요. 고유 메서드를 판별할 때
static boolean isWrapperInstance(Object x)— 주어진 객체가asInterfaceInstance호출로 만들어졌는지 여부를 판별해요.static MethodHandle wrapperInstanceTarget(Object x)— 이 래퍼 인스턴스의 고유 메서드와 동작적으로 동등한 target 메서드 핸들을 만들어 복구해요.static Class<?> wrapperInstanceType(Object x)— 이 래퍼 인스턴스가 만들어진 고유 단일 메서드 인터페이스 타입을 복구해요.
자바 1.7부터 제공돼요.