더 자바 코드를 조작하는 방법 - 모자에서 토끼를 꺼내는 마술 바이트코드 조작은 막강한 기능이다. 아무것도 없는 모자에서 토끼를 꺼내는 마술이 가능하다. 바이트 코드 조작 라이브러리 바이트 코드 조작라이브러리는 크게 3가지로 주로 사용된다. 1.ASM 2.Javassist 3.ByteBuddy ASM 가장 고전적이고, 널리 쓰이는 라이브러리 Visitor, Adapter Pattern을 잘 알고 있어야 사용이 가능하며 사용하기 어렵다. https://asm.ow2.io/ Javassist https://www.javassist.org/ ByteBuddy 문서가 잘 되어있고, 사용하기쉽다. 성능적인 면에서도 추천 하는 라이브러리이다. https://bytebuddy.net ByteBuddy 사용하기 Byt..
코드 커버리지 바이트 코드를 조작하는 대표적인 예인 코드 커버리지툴을 살펴본다. 코드 커버리지란 ? 코드 커버리지는 테스트코드가 내 소스코드의 어느정도를 테스트하는지 확인하는 툴이다. 최근에 가장 많이 사용하는 jacoco 라는 툴을 살펴본다 jacoco 플러그인 추가하기 maven pom.xml에 jacoco 플러그인 설정을 추가한다. 테스트 코드 작성하기 Group Group 이라는 간단한 클래스를 생성한다. 그룹에는 최대 참가자와 현재 신청자 정보를 가지고 있으며, isFull() 메소드를 통해 참가신청이 완료되었는지 확인할 수 있다. 이때 최대 참가자의 수가 0 이라면 무한 정으로 받을수 있는 그룹이다. GroupTest Group클래스의 isFull 메소드를 테스트하는 간단한 코드이다. grou..
ClassLoader System 클래스 로더 클래스 로더의 처리 과정은 로딩, 링크, 초기화 3단계로 나뉜다. 로딩 -> 링크 -> 초기화 순으로 진행된다. 로딩 클래스 로더가 .class파일을 읽고, 내용에 따라 적절한 바이너리 데이터를 생성하고, 메소드 영역에 저장한다. 메소드 영역에 저장되는 데이터 FQCN 풀패키지 경로 클래스 인지 인터페이스 인지 Enum 인지 구분을 한다 메소드와 변수 로드가 끝나면 해당 클래스타입의 Class객체를 생성하여 힙 영역에 저장한다. 클래스로더는 3개의 계층구조로 이루어져 있으며 3가지 기본 클래스 로더가 제공된다. 부트스트랩 클래스 로더 (네이티브) 플랫폼 클래스 로더 애플리케이션 클래스 로더 부트스트랩 클래스 로더 JAVA_HOME\lib에 존재하는 코어 자바..
JVM의 구조 클래스로더 .class에서 바이트코드를 읽고 메모리에 저장 로딩: 클래스 읽어오는 과정 링크: 레퍼런스들을 연결한다 초기화: static 값들 초기화 및 변수에 할당 메모리 크게 5가지 영역이 존재한다. 메소드 영역 클래스 수준의 정보 클래스명(패키지명 포함), 부모클래스명(상속받은 클래스 존재시) 메소드, 변수 정보를 저장한다. 메소드 영역에 존재하는 자원은 공유자원이다. 다른영역에서 접근이 가능하다. 힙 영역 인스턴스를 저장한다. 클래스를 로딩만해도 .class 타입의 객체가 저장이 된다. App 클래스가 로드되면 A.class 객체가 저장된다. 명시적으로 생성한 객체도 저장된다. 스택 영역 (Thread) 스레드에서 공유하는 자원 스레드마다 RuntimeStack이 생성되고, 내부에 ..