Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- rest api
- Generic
- JWT
- bounded context
- mockito
- AOP
- ddd
- MSA
- PSA
- redis
- SOA
- 서명
- Java
- *
- Spring Data Redis
- jvm
- OOP
- Rest
- JSON
- Exception
- di
- Transaction
- IOC
- spring
- bytecode
- junit5
- reflection
Archives
- Today
- Total
개발자일기
코드를 조작하는 방법 본문
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