본문 바로가기

전체글236

javaagent 사용해보기 이전 글에서 Byte Buddy를 사용하여 바이트코드를 조작해봤습니다. 하지만 1가지 문제점이 있었습니다. import net.bytebuddy.ByteBuddy; import net.bytebuddy.implementation.FixedValue; import java.io.File; import java.io.IOException; import static net.bytebuddy.matcher.ElementMatchers.named; public class Masulsa { public static void main(String[] args) { try { new ByteBuddy().redefine(Moja.class) .method(named("pullOut")).intercept(FixedVa.. 2021. 10. 28.
바이트코드 조작 라이브러리 바이트코드 조작 라이브러리 ASM Javassist ByteBuddy 바이트코드 조작해보기 모자에서 토끼를 꺼내는 마술 Moja.java public class Moja { public String pullOut() { return ""; } } Masulsa.java public class Masulsa { public static void main(String[] args) { System.out.println(new Moja().pullOut()); } } 빈 문자열을 리턴하므로 빈 문자열이 출력됩니다. Byte Buddy 의존성 추가 net.bytebuddy byte-buddy 1.11.21 Masulsa 클래스에 코드 추가 import net.bytebuddy.ByteBuddy; import n.. 2021. 10. 27.
코드 커버리지 측정하는 방법 코드 커버리지 테스트 코드가 내 소스 코드의 몇 퍼센트(%)를 커버하는지 확인하는 것입니다. JaCoCo pom.xml에 플러그인 추가 org.jacoco jacoco-maven-plugin 0.8.7 prepare-agent report prepare-package report prepare-agent: javaagent를 끼어넣는 것 report: report를 생성하는 것 메이븐 빌드 mvn clean verify 테스트 코드를 실행하고 jacoco 플러그인이 실행됩니다. target -> site -> jacoco -> index.html이 확인됩니다. index.html을 실행합니다. 결과 확인 어느 부분이 테스트가 안되었고, 일부만 되었는지 확인할 수 있습니다. 원리 간략하게 설명하면 바이트코.. 2021. 10. 27.
클래스 로더 클래스 로더 로딩, 링크, 초기화 순으로 진행됩니다. 로딩 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 "메소드" 영역에 저장. 이때 메소드 영역에 저장하는 데이터 FQCN 풀 패키지 경로를 포함한 클래스 이름 클래스 | 인터페이스 | 이늄 메소드와 변수 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 "힙" 영역에 저장. 링크 Verify, Prepare, Resolve(optional) 세 단계로 나눠져 있습니다. 검증: .class 파일 형식이 유효한지 체크합니다. Preparation: 클래스 변수(static 변수)와 기본값에 필요한 메모리를 준비하는 과정 Resolve: 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체합니.. 2021. 10. 26.