바이트코드를 읽으면서 코드에서 버그를 찾을 수 있고 복잡도 계산 가능
소스 코드 없이 바이트코드만 있어도 분석 가능
기존 소스 코드 대신, 실행할 프록시 생성 가능
특정 API 호출 제한 가능
JVM 언어들을 컴파일 할 때 바이트코드를 생성해서 JVM 위에서 동작 가능하게 해준다.
자바 소스 코드를 건드리지 않고, 코드 변경이 필요한 경우에도 사용 가능
프로파일러
실행 중인 애플리케이션 메모리 사용량, 쓰레드 사용량 등의 각종 성능 분석 툴
javaagent로 바이트코드 조작 👉 원하는 정보 추출 또는 특정 값을 구할 때 사용
ex) Naver Pinpoint
최적화
스프링이 컴포넌트 스캔을 할 때 사용하는 클래스가 ClassPathScanningCandidateComponentProvider
MetadataReader metadataReader = this.getMetadataReaderFactory().getMetadataReader(type);
SimpleMetadataReader(Resource resource, @Nullable ClassLoader classLoader) throws IOException {
SimpleAnnotationMetadataReadingVisitor visitor = new SimpleAnnotationMetadataReadingVisitor(classLoader);
getClassReader(resource).accept(visitor, 7);
this.resource = resource;
this.annotationMetadata = visitor.getMetadata();
}
ClassPathScanningCandidateComponentProvider 👉 SimpleMetadataReader 👉 ClassReader, Visitor 👉 메타 정보를 읽어옴(애노테이션 정보 추출)
이런 순으로 프로그램을 분석하고 빈으로 등록할 대상을 찾는데 사용
바이트코드 조작 라이브러리는 ASM, Javassit, ByteBuddy, CGlib 등이 있다.