StaticClass

StaticClass (클래스의 정적 멤버 접근자)

클래스의 정적 멤버(정적 메서드·프로퍼티·필드)에 접근할 수 있게 하고, StandardOperation.NEW 연산으로 인스턴스를 생성할 수 있게 해 주는 불변 객체입니다. Dynalink에서 클래스 이름이 아니라 실제 객체로써 '정적 멤버의 네임스페이스이자 생성자' 역할을 하게 만드는 것이라고 볼 수 있어요.

출처: Java API Reference

본문

Dynalink는 Class 객체를 특별히 취급하지 않고 평범한 자바 객체처럼 다룹니다. 예를 들어 GET:PROPERTY:superclass 같은 프로퍼티 게터로 clazz.getSuperclass()를 호출할 수 있어요. 하지만 Class 객체로는 클래스의 정적 멤버에 접근하거나 NEW로 새 인스턴스를 만들 수 없습니다.

자바에서도 new BitSet.class()라고 쓰지 않고 new BitSet()이라고 쓰며, System.class.out이 아니라 System.out이라고 쓰죠. 클래스 이름을 생성자 겸 정적 멤버의 네임스페이스로 사용하는 이런 자바의 면모를 Dynalink에서 객체로 구현한 것이 StaticClass입니다.

BeansLinker는 이 클래스의 객체를 특별하게 인식해, 그 위의 연산을 대표하는 클래스의 정적 멤버에 연결합니다. 추가로 "class"라는 합성 프로퍼티가 인식되어 자바의 System.classClass 객체로 평가되는 것처럼 실제 Class 객체를 반환해요. 반대로 BeansLinker를 통해 노출된 Class 객체는 자신의 StaticClass를 돌려주는 "static" 합성 프로퍼티를 가집니다.

요약하면 이 클래스의 인스턴스는 정적 멤버의 네임스페이스이자 클래스의 생성자 역할을 합니다. 자바에서 클래스 이름을 쓰는 것과 비슷하되, 자바에서는 문법 요소일 뿐인 것을 Dynalink에서는 실제 객체로 표현한다는 차이가 있어요.

자바 배열 타입을 나타내는 StaticClass 객체는 정수 하나를 받아 해당 크기의 배열을 만드는 생성자처럼 동작합니다. 클래스에 생성자가 여럿 있으면 NEW는 가장 구체적인 적용 가능 생성자를 선택하려 시도하며, 명시적인 시그니처로 생성자를 고르는 메커니즘은 BeansLinker.getConstructorMethod(Class, String)로 제공할 수 있어요.

정리하자면 StaticClass는 클래스의 정적 측면을 객체로 감싸, Dynalink의 동적 연산 모델 안에서 자바의 ClassName.멤버 접근을 그대로 표현할 수 있게 합니다. 자바에서는 문법적 요소에 불과하던 '클래스 이름'이 Dynalink에서는 실제 객체로서 생성자 호출과 정적 멤버 접근의 네임스페이스 역할을 하는 것이 핵심이에요.

메서드

  • forClass(Class<?> clazz) — 지정한 클래스의 StaticClass 인스턴스를 반환합니다.
  • getRepresentedClass() — 이 객체가 나타내는 자바 클래스를 반환해요.

더 알아보기

Java 공식 API