자바 기반 동적 에이전트 cglib 상세 설명
테스트 를 통 해 jdk 생 성 대상 의 속 도 는 cglib 보다 훨씬 높 습 니 다.이것 은 cglib 가 대상 을 만 들 때 바이트 코드 를 조작 해 야 하기 때 문 입 니 다.cglib 의 실행 속 도 는 jdk 보다 약간 높 기 때문에 단일 모드 에 적합 합 니 다.또한 CGLIB 의 대부분 분 류 는 자바 바이트 코드 를 직접 조작 하기 때문에 생 성 된 클래스 는 자바 의 영구적 인 더미 에 있 습 니 다.동적 에이전트 가 너무 많이 작 동 하면 영구적 으로 가득 차 서 OutOf Memory 이상 이 발생 하기 쉽 습 니 다.spring 은 기본적으로 jdk 동적 대 리 를 사용 합 니 다.클래스 에 인터페이스 가 없 으 면 cglib 를 사용 합 니 다.
서비스
package proxy.cglib;
/**
* @Description: <br/>
*
* <p>
* <br/>
* @Author: Qz1997
* @create 2021/5/1 10:51
*/
public class OrderServiceImpl {
/**
*
*
* @param orderNo
* @return
*/
public String preOrder(String orderNo) {
System.out.println("OrderServiceImpl.preOrder" + orderNo);
return " ";
}
/**
*
*
* @return
*/
public String list() {
return "list";
}
}
3.대리 공장
package proxy.cglib;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Objects;
/**
* @Description: <br/>
* Cglib
* final final
* <p>
* <br/>
* @Author: Qz1997
* @create 2021/5/1 13:24
*/
public class CglibProxyFactory implements MethodInterceptor {
/**
*
*
* @param clazz
* @return
*/
public Object creatProxyedObj(Class<?> clazz) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
/**
*
*
* @param proxyObject
* @param method
* @param args
* @param methodProxy
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxyObject, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
// null || <= 0
if (Objects.isNull(args) || args.length <= 0) {
return methodProxy.invokeSuper(proxyObject, args);
}
/// //
// if (method.isAnnotationPresent(Async.class)) {
// // ....
// // return method.invoke(proxy, arg);
// }
Parameter[] parameters = method.getParameters();
Parameter parameter = parameters[0];
Class<?> type = parameter.getType();
// String
if (type == String.class) {
String orderNo = (String) args[0];
if (Objects.nonNull(orderNo) && orderNo.length() < 10) {
throw new RuntimeException(" ");
}
}
String result = (String) methodProxy.invokeSuper(proxyObject, args);
if (Objects.equals(result, " ")) {
System.out.println(" ");
}
return result;
}
}
결과자바 기반 의 동적 에이전트 Cglib 에 대한 자세 한 설명 은 여기까지 입 니 다.더 많은 자바 동적 에이전트 Cglib 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.