목차

더 자바, 코드를 조작하는 다양한 방법

JVM(Java Virtual Machine)

Java11 부터는 Jre를 제공하지 않음
Java9부터 모듈 개념이 들어옴

JRE, JDK

오라클에서 만든 자바11 버전부터는 상용으로 사용할 때 유료 오라클에서 만든 open-jdk는 버전 업그레이드도 되고 무료

JVM에서 구동되는 언어로는

 클로저, 그루비, JRuby, Jython, 코틀린, ...

JVM 구조

클로스 로더 시스템

메모리

스택, PC(PC registers), 네이티브 메소드 스택

실행 엔진(Execution Engine)

JIT 컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔둔다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.

클래스 로더 시스템

로딩, 링크, 초기화 순으로 진행된다.

로딩

클래스 로더

:-P ClassFileNotFoundException은 클래스 로드가 못 찾는 것

링크

Verify, Prepare, Resolve(optional)

초기화

Static 변수의 값을 할당한다. (static 블럭이 있다면 실행 된다)

바이트 코드 보기

$> javap -c -v ${클래스 파일 경로} // -v 애노테이션 정보도 볼 수 있음
Compiled from "CodeManipulationApplication.java"
public class com.repia.java.codemanipulation.CodeManipulationApplication {
  public com.repia.java.codemanipulation.CodeManipulationApplication();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return
 
  public static void main(java.lang.String[]);
    Code:
       0: ldc           #1                  // class com/repia/java/codemanipulation/CodeManipulationApplication
       2: aload_0
       3: invokestatic  #16                 // Method org/springframework/boot/SpringApplication.run:(Ljava/lang/Class;[Ljava/lang/String;)Lorg/springframework/context/ConfigurableA
pplicationContext;
       6: pop
       7: return
}

리플렉션

스프링 Dependency Injection

어떻게 동작할까?