Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

개발자일기

코드를 조작하는 방법 본문

개발

코드를 조작하는 방법

ka0oll 2020. 3. 21. 01:24

ByteCode 조작

compile결과인 bytecode를 조작

classLoader가 클래스를 읽어올때 javaagent의 premain에서 조작시도

  • 이미 런타임에 조작시 클래스가 메모리에 로드된 상태임
  • ByteBuddy 라이브러리 사용

APM툴 같은것들이 조작을이용한다.

Reflection

클래스로더에 의해 메모리에 로딩된 class정보 조회
필드, 메소드 , 상위 클래스, 상위 인터페이스를 가져옴,

어노테이션

  • annotion을 @Retetion을 runtime까지 유지시키면 annotion정보를 가져올수있다.

Class를 이용한 객체생성

  • Constructor.newInstance(), Constructor.newInstance(params)
  • 적합한 생성자 존재 필요

필드에 접근

  • private에도 접근 가능, 최근 자바 라이브러들

다이나믹 프록시

프록시 패턴, AOP방식

  • 실제 구현체는 따로있고 실제 구현체의 기능 + 부가기능등을 적용
  • ex) 트랜잭션, 로깅
  • class, interface 상속으로 구현

DynamicProxy

  • Spring Data jpa 사용
  • java reflection api
  • interface구현 필요, 해당 interface를 상속하는 class를 생성
  • Proxy.newProxyInstance
BookService bookService = (BookService) Proxy.newProxyInstance(BookService.class.getClassLoader(), new Class[]{BookService.class},
        new InvocationHandler() {
            BookService bookService = new DefaultBookService();
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if (method.getName().equals("rent")) {
                    System.out.println("aaaa");
                    Object invoke = method.invoke(bookService, args);
                    System.out.println("bbbb");
                    return invoke;
                }

                return method.invoke(bookService, args);
            }
        });

CGLIB

  • Byte Code Generation Library
  • 다이나믹 프록시는 interface필수
  • 상속받은 클래스를 생성해줌
  • CLASS파일 만들어냄

annotation processor

런타임이 아닌 컴파일 타임에 바이트코드가 아닌 실제 코드를 조작

  • 적용하려하는 annotation들을 읽어들어 실제 코드를 조작한다.
  • lombok
  • 이정도까지만 알자..

'개발' 카테고리의 다른 글

Spring의 핵심 및 기술  (0) 2020.03.21
도커를 이용한 테스트  (0) 2020.03.21
JUnit5을 이용한 단위테스트  (0) 2020.03.21
MSA 마이크로아키텍처 알아보자(1)  (1) 2020.03.21
JVM  (0) 2020.03.21
Comments