문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
wiki:java:코드조작 [2022/04/28 15:29] dhan |
wiki:java:코드조작 [2023/01/13 18:44] (현재) |
||
---|---|---|---|
줄 1: | 줄 1: | ||
====== 더 자바, 코드를 조작하는 다양한 방법 ====== | ====== 더 자바, 코드를 조작하는 다양한 방법 ====== | ||
- | |||
- | |||
- | |||
===== JVM(Java Virtual Machine) ===== | ===== JVM(Java Virtual Machine) ===== | ||
줄 47: | 줄 44: | ||
+ | ===== 클래스 로더 시스템 ===== | ||
+ | 로딩, 링크, 초기화 순으로 진행된다. | ||
+ | |||
+ | ==== 로딩 ==== | ||
+ | * 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 " | ||
+ | * 메소드 영역에 저장되는 데이터 | ||
+ | * FQCN: Fully Qualified Class Name | ||
+ | * 클래스 | 인터페이스 | ENUM | ||
+ | * 메소드와 변수 | ||
+ | * 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 " | ||
+ | |||
+ | 클래스 로더 | ||
+ | * 부트 스트랩 클래스 로더: JAVA_HOME/ | ||
+ | * 플랫폼 클래스 로더(Extension 클래스 로드): JAVA_HOME/ | ||
+ | * 애플리케이션 클래스 로더: 애플리케이션 클래스패스(-classpath, | ||
+ | |||
+ | :-P ClassFileNotFoundException은 클래스 로드가 못 찾는 것 | ||
+ | |||
+ | ==== 링크 ==== | ||
+ | Verify, Prepare, Resolve(optional) | ||
+ | * 검증: .class 파일 형식이 유효한지 체크한다. | ||
+ | * Preparation: | ||
+ | * Resolve: 심볼리 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다. | ||
+ | |||
+ | ==== 초기화 ==== | ||
+ | Static 변수의 값을 할당한다. (static 블럭이 있다면 실행 된다) | ||
줄 53: | 줄 76: | ||
==== 바이트 코드 보기 ==== | ==== 바이트 코드 보기 ==== | ||
<code bash> | <code bash> | ||
- | $> javap -c ${클래스 파일 경로} | + | $> javap -c -v ${클래스 파일 경로} |
Compiled from " | Compiled from " | ||
public class com.repia.java.codemanipulation.CodeManipulationApplication { | public class com.repia.java.codemanipulation.CodeManipulationApplication { | ||
줄 72: | 줄 95: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | |||
+ | ===== 리플렉션 ===== | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== 스프링 Dependency Injection ==== | ||
+ | 어떻게 동작할까? | ||
+ | |||
+ | |||
+ | |||
{{tag> | {{tag> |