[Java] 바이트코드 조작 ③

홍정완·2022년 7월 30일
0

Java

목록 보기
20/25
post-thumbnail

바이트코드 조작 활용 예시


프로그램 분석


  • 바이트코드를 읽으면서 코드에서 버그를 찾을 수 있고 복잡도 계산 가능

  • 소스 코드 없이 바이트코드만 있어도 분석 가능



클래스 파일 생성


  • 기존 소스 코드 대신, 실행할 프록시 생성 가능

    • Spring AOP, Hibernate Lazy Loading, Mock Framework

  • 특정 API 호출 제한 가능

  • JVM 언어들을 컴파일 할 때 바이트코드를 생성해서 JVM 위에서 동작 가능하게 해준다.



etc.


자바 소스 코드를 건드리지 않고, 코드 변경이 필요한 경우에도 사용 가능


  • 프로파일러

    • 실행 중인 애플리케이션 메모리 사용량, 쓰레드 사용량 등의 각종 성능 분석 툴

    • javaagent로 바이트코드 조작 👉 원하는 정보 추출 또는 특정 값을 구할 때 사용

    • ex) Naver Pinpoint


  • 최적화

    • 바이트코드 조작 👉 불필요한 코드 제거, 중복 코드 제거

  • 로깅



스프링이 컴포넌트 스캔을 하는 방법 (asm)


  • 스프링이 컴포넌트 스캔을 할 때 사용하는 클래스가 ClassPathScanningCandidateComponentProvider

    • 내부적으로 asm 사용


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 등이 있다.

    • ASM은 고전, ByteBuddy는 비교적 최근 라이브러리
    • 스프링은 ASM 사용
    • Hibernate는 javassist에서 ByteBuddy로 변경 중
    • Mockito는 CGLib에서 ByteBuddy로 변경
profile
습관이 전부다.

0개의 댓글