개발
코드를 조작하는 방법
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
- 이정도까지만 알자..