2023. 5. 2. 15:34ㆍHigh 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 |