문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
|
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> | ||