BeansLinker

BeansLinker (일반 자바 객체 링커)

일반 자바 객체를 위한 링커입니다. Dynalink에서 보통 DynamicLinkerFactory가 사용하는 최종 폴백(fallback) 링커 역할을 하여, 다른 링커가 인식하지 못한 모든 객체에 대한 호출을 연결할 기회를 얻어요.

출처: Java API Reference

본문

GuardingDynamicLinker를 구현하는 클래스로, 자바 객체의 다양한 멤버를 동적 연산에 노출시킵니다. 구체적으로 하는 일은 이래요.

  • 레코드라면 레코드 컴포넌트의 모든 공개 접근자를 StandardNamespace.PROPERTY 네임스페이스의 StandardOperation.GET 프로퍼티 게터로 노출해요.
  • setXxx(), getXxx(), isXxx() 형태의 공개 메서드를 PROPERTY 네임스페이스의 GET/SET 연산용 프로퍼티 세터·게터로 노출합니다.
  • 모든 공개 메서드를 StandardNamespace.METHOD 네임스페이스의 GET 연산으로 노출해, 가져온 메서드는 StandardOperation.CALL로 호출할 수 있어요.
  • 같은 이름의 게터·세터가 없는 공개 필드를 프로퍼티로 노출합니다.
  • 자바 배열, List, Map의 요소를 ELEMENT 네임스페이스의 GET/SET 연산으로 노출하고, List/Map의 요소 제거는 REMOVE 연산으로 노출해요.
  • 배열, Collection, Maplength라는 가상 프로퍼티를 노출합니다.
  • StaticClass 인스턴스에 대한 StandardOperation.NEW를 생성자 호출로 연결합니다. 배열을 나타내는 StaticClass도 포함되는데, 이 경우 생성자는 배열 길이를 나타내는 int 하나를 받아요.
  • StaticClass 객체에는 정적 메서드·필드·프로퍼티를 인스턴스 멤버와 비슷한 방식으로 노출합니다.
  • Class 인스턴스에는 그 StaticClass에 접근하기 위한 static이라는 가상 프로퍼티를 노출해요.

오버로드된 메서드 해석은 프로퍼티 세터, 메서드, 생성자에 대해 자동으로 수행됩니다. 또한 콜 사이트의 이름에 명시적인 시그니처를 지정해 수동으로 오버로드된 메서드를 고를 수도 있어요. 예를 들어 StandardOperation.GET.withNamespace(METHOD).named("parseInt(String,int)")처럼요. 시그니처에는 패키지를 생략한 클래스 이름을 쓸 수 있고, 선택이 모호해질 때만 정규화된 이름을 쓰면 됩니다.

가변 인자 호출은 메서드와 생성자 양쪽에서 처리됩니다. 호출자에 민감한(caller sensitive) 메서드도, 그 외에 공개 메서드이고 링크 요청이 충분한 권한의 MethodHandles.Lookup 객체를 가진 콜 사이트 설명자를 지닌다면 연결할 수 있어요.

누락된 멤버 처리 동작은 생성자에 MissingMemberHandlerFactory를 전달해 커스터마이즈할 수 있습니다. 이 클래스는 또 클래스와 인스턴스에서 사용 가능한 프로퍼티·메서드 이름을 찾는 여러 메서드와, getLinkerForClass(Class)를 통한 클래스별 링커 접근도 제공합니다.

생성자

  • BeansLinker() — 새 빈즈 링커를 만듭니다.
  • BeansLinker(MissingMemberHandlerFactory missingMemberHandlerFactory) — 누락 멤버 핸들러를 만드는 팩토리를 지정해 새 링커를 만듭니다.

주요 메서드

  • getGuardedInvocation(LinkRequest request, LinkerServices linkerServices) — 콜 사이트에서 주어진 인자로 특정 호출에 알맞은 가드된 호출을 만듭니다.
  • getLinkerForClass(Class<?> clazz) — 특정 단일 클래스를 위한 빈즈 링커를 반환합니다.
  • getConstructorMethod(Class<?> clazz, String signature) — 주어진 클래스와 시그니처의 생성자에 해당하는 동적 메서드를 돌려줍니다.
  • getInstanceMethodNames(Class<?>), getReadableInstancePropertyNames(Class<?>) 등 — 클래스의 인스턴스 메서드·읽기 가능 프로퍼티 이름 집합을 반환합니다.

더 알아보기

Java 공식 API