자바 기반 동적 에이전트 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 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기