MethodHandleProxies — 메서드 핸들을 다른 JVM 타입에 적응시키는 static 메서드 모음

MethodHandleProxies — 메서드 핸들을 다른 JVM 타입에 적응시키는 static 메서드 모음

MethodHandleProxies메서드 핸들을 인터페이스 같은 다른 JVM 타입에 적응시키는 데 도움을 주는 static 메서드들로만 이루어진 클래스예요.

출처: Java API Reference

본문

메서드 핸들은 자바 타입이 아니라서, 인터페이스가 필요한 곳(예: 콜백으로 받는 API)에 그대로 넘길 수 없어요. asInterfaceInstance로 메서드 핸들을 단일 메서드 인터페이스의 인스턴스로 감싸면, 그 인터페이스를 요구하는 코드에 넘길 수 있어요.

static 메서드

  • static <T> T asInterfaceInstance(Class<T> intfc, MethodHandle target) — 주어진 단일 메서드 인터페이스의 인스턴스를 만들어, 그 호출을 주어진 메서드 핸들로 리다이렉트해요.
    • 단일 메서드 인터페이스는 고유하게 이름 붙은 메서드를 선언하는 인터페이스예요. 고유 메서드를 판별할 때 Object의 public 메서드(toString, equals, hashCode)와 default(비추상) 메서드는 무시돼요. 예를 들어 ComparatorObject.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부터 제공돼요.

더 알아보기 (Learn more)