![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/RelDf/btqy9rKdjOf/ePVYCjvNIU8kNlkLQDB88k/img.png)
기존에는 ByteBuddy를 사용해서 전처리를 해준뒤, 다시 실행해야지만 모자에서 토끼가 나오는 마술이 일어난다. ByteBuddy로 바이트코드 조작을 하는 시점에 이미 Hat클래스를 로드 했기때문에, ByteBuddy로 바이트조작을 한다 한들, 실행라인에서 새로이 클래스를 로드하지 않기때문에 발생하는 일이다. 하지만 이런경우는 우리가 바라는 그림이 아니다. 우리가 바라는 그림은 현재 마술사 클래스에서 아무런 전처리작업 없이 실행만 하여도 모자에서 토끼가 나오는 마술이 펼쳐지는 것이다. JavaAgent 소개 JDK는 JVM이 구동될때 이 JVM내에서 특정 작업을 수행할 에이전트, 즉 요원을 지정할 수 있는 방식을 제공해왔다. JDK1.5 이전 버전에서는 JVMPI(JVM Profiler Interfac..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/waW74/btqy5TtZhoj/dQFwQHlRg4DPk768t3Sa7K/img.png)
더 자바 코드를 조작하는 방법 - 모자에서 토끼를 꺼내는 마술 바이트코드 조작은 막강한 기능이다. 아무것도 없는 모자에서 토끼를 꺼내는 마술이 가능하다. 바이트 코드 조작 라이브러리 바이트 코드 조작라이브러리는 크게 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..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bKy55A/btqy660t0q6/98lB4zHRbTMpK4CgiDew7K/img.png)
코드 커버리지 바이트 코드를 조작하는 대표적인 예인 코드 커버리지툴을 살펴본다. 코드 커버리지란 ? 코드 커버리지는 테스트코드가 내 소스코드의 어느정도를 테스트하는지 확인하는 툴이다. 최근에 가장 많이 사용하는 jacoco 라는 툴을 살펴본다 jacoco 플러그인 추가하기 maven pom.xml에 jacoco 플러그인 설정을 추가한다. 테스트 코드 작성하기 Group Group 이라는 간단한 클래스를 생성한다. 그룹에는 최대 참가자와 현재 신청자 정보를 가지고 있으며, isFull() 메소드를 통해 참가신청이 완료되었는지 확인할 수 있다. 이때 최대 참가자의 수가 0 이라면 무한 정으로 받을수 있는 그룹이다. GroupTest Group클래스의 isFull 메소드를 테스트하는 간단한 코드이다. grou..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/ctUMgc/btqy5DkGG38/QuFMJl8976LKotLK0PszJK/img.png)
ClassLoader System 클래스 로더 클래스 로더의 처리 과정은 로딩, 링크, 초기화 3단계로 나뉜다. 로딩 -> 링크 -> 초기화 순으로 진행된다. 로딩 클래스 로더가 .class파일을 읽고, 내용에 따라 적절한 바이너리 데이터를 생성하고, 메소드 영역에 저장한다. 메소드 영역에 저장되는 데이터 FQCN 풀패키지 경로 클래스 인지 인터페이스 인지 Enum 인지 구분을 한다 메소드와 변수 로드가 끝나면 해당 클래스타입의 Class객체를 생성하여 힙 영역에 저장한다. 클래스로더는 3개의 계층구조로 이루어져 있으며 3가지 기본 클래스 로더가 제공된다. 부트스트랩 클래스 로더 (네이티브) 플랫폼 클래스 로더 애플리케이션 클래스 로더 부트스트랩 클래스 로더 JAVA_HOME\lib에 존재하는 코어 자바..