Java Class Object

2023. 5. 2. 15:34High Level Programming Language/Reflection

클래스 객체(Class Object)의 정책적 이해: JVM 관점에서 보는 모델

"Java에서 '클래스'는 반드시 설계도이자 코드 블록이지만, JVM의 감정에서는 레벨 메타가 담긴 모델입니다. 반드시 코드가 또 다음 가지 역할을 합니다."

1. 클래스 객체(Class Object)라는 것의 정체

JVM은 .class 파일을 로드하여 각 클래스에 대한 메타데이터를 생성합니다.
그렇다에 JVM 관점에서 '클래스'는 일정 구조체(Klass 구조체)로 표현되며, 각 클래스의 정책적 정보를 가지고 있는 '클래스 객체'입니다.

Java 코드에서는 Class<T> 타입의 객체로 나타나며, Car.class, obj.getClass() 같은 형식으로 접근할 수 있습니다.

 

2. 클래스 객체가 가지는 정보

클래스 객체는 하나의 객체가 아니라, 다수의 객체에서 공용되는 클래스의 메타데이터를 감당합니다. 역할은 다음과 같습니다:

구조 내용
클래스 이름 모든 FQCN (com.example.Car)
수퍼 클래스 상위 클래스 정보
인터페이스 관련 인터페이스 목록
필드 이름, 타입, 접근자
메서드 타입, 시그니처, 배이트코드
정적 필드 static field 값
메서드 테이블 (vtable) 번역시 호출 구조
사용 중 아규먼트 개수와 호출 모든 literal, method ref, field ref
클래스 로더 ClassLoader 객체 참조

 

3. 객체가 클래스의 메서드에 접근하는 구조

객체가 생성될 때 JVM은 해당 클래의 Klass 구조체 정보가 들어있는 이어진 포인터(Klass Pointer)를 객체에 포함합니다.

다음은 HotSpot JVM 기준의 객체 메모리 구조를 공개한 것입니다:

[Object Memory Layout]
┌───────────────────────────────┐
│ Mark Word (8 bytes)     │ ← 해시코드, 락, GC 정보
├───────────────────────────────┼
│ Klass Pointer (8 bytes) │ ← 클래스 메타데이터 참조 포인터
├───────────────────────────────┼
│ 인스턴스 필드         │ ← 클래스에서 정의한 메밀리리 필드
├───────────────────────────────┼
│ 패딩(Padding) (optional) │ ← 8/16바이트 정렬 복잡
└───────────────────────────────┘

각 객체는 가장 아래에 공용되는 Klass Pointer를 통해 건설되는 vtable (virtual method table)에 접근합니다.

 

4. JVM 데이터 조직의 조회자: Class 객체

Java 코드 상에서 클래스 객체에 접근하려면 java.lang.Class<T> 객체를 사용합니다.

Class<?> clazz = Class.forName("com.example.Car");
Method m = clazz.getMethod("drive");
m.invoke(new Car());

그리고 car.getClass() 또한 Car.class 와 같은 형식을 통해 어떻게 로드되고, 다룰수 있는 모든 클래스가 하나의 객체로 만드어진 Class 에 따라 표현됩니다.

 

5. 요즘 클래스 객체를 이용하는 중요 모델

사용 체계 기능
리플렉션 API 메서드/필드/생성자 조회, 추정, 호출
타입 체크 instanceof, isAssignableFrom
버치 프로크시 Proxy.newProxyInstance()
단일치 객체화 ClassLoader의 다른 복사가 각각 다른 객체 표현

요약

  • 클래스 객체는 JVM이 클래스를 로드한 후, 메타데이터를 관리하기 위해 생성한 객체이며,
  • java.lang.Class<T> 타입으로 접근 가능
  • 이는 JVM의 목걸리, 환경 변수, 반응성, 호출 관리의 교체가 가능한 구조로, Java의 동적성 데이터 처리에 회수적인 기술적 방식을 제공합니다.

'High Level Programming Language > Reflection' 카테고리의 다른 글

클래스 로딩과 관련된 제약 사항  (0) 2023.05.19
Proxy Target Class 조건  (0) 2023.05.17
sealed interface  (0) 2023.05.08
Structuring method calls  (0) 2023.05.02
Java Dynamic Proxy Classes  (0) 2023.04.28