java动态代理的简单使用

一 简单实现

1 jdk原生动态代理

Proxy:Proxy是所有的动态代理的父类,它提供了一个静态方法来创建动态代理的class对象和实例;

InvocationHandler:每一个动态代理都有一个关联的InvocationHandler,在代理实例上调用方法时,方法调用将被转发到InvocationHandler.invoke方法;

简单实例:

需要被代理的类实现的接口
public interface OrderService {
    boolean save();
}
需要被代理的类的实现
public class OrderServiceImpl implements OrderService{

    @Override
    public boolean save(){
        return true;
    }
}
生成代理类的工具
public class JdkProxy implements InvocationHandler {
    /**
     * 被代理对象
     */
    private Object target = null;

    public Object build(Object target){
        this.target = target;
        // Proxy.newProxyInstance方法包含3个方法
        // param loader: the class loader to define the proxy class,类加载器,我们采用target本身的类加载器
        // param interfaces: the list of interfaces for the proxy class to implement
        // param h: the invocation handler to dispatch method invocations to 
定义实现方法逻辑的代理类,this表示当前对象,
它必须实现InvocationHandler接口的invoke方法,它就是代理逻辑方法的实现方法。
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    /**
     * 代理方法逻辑
     * @paran proxy 代理对象
     * @paran method 当前调度方法
     * @paran args 当前方法参数
     * @return 代理结果返回
     * @throws Throwable 异常
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(target, args);
        return result;
    }
}

jdk代理测试
@Slf4j
public class JdkProxyTest {
    public static void main(String[] args) {
        JdkProxy jdkProxy = new JdkProxy();
        OrderService orderService1 = (OrderService) jdkProxy.build(new OrderServiceImpl());
        orderService1.save();
        log.info("结果:{}",orderService1.save());
    }
}

2 cglib动态代理

CGLIB(Code Generation Library)是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成,CGLIB通过继承方式实现代理;

Enhancer:来指定要代理的目标对象,实际处理代理逻辑的对象,最终通过调用create()方得到代理对象,对于这个代理对象的所有非final方法的调用,都会转发给MethodInterceptor;

MethodInterceptor:动态代理对象的方法调用都会转发到intercept方法进行增强;

简单实例:

被代理类
public class CglibOrderServiceImpl {
    public boolean save(){
        return true;
    }
}
代理方法
import lombok.extern.slf4j.Slf4j;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * \* Created with IntelliJ IDEA.
 * \* @author: wucj
 * \* @date: 2020/9/13 17:12
 * \* @description:
 * \
 */
@Slf4j
public class CglibOrderServiceInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        log.info("cglib执行方法前...");
        Object result = methodProxy.invokeSuper(o,objects);
        log.info("cglib执行方法后...");
        return result;
    }
}
单元测试
import org.springframework.cglib.proxy.Enhancer;

/**
 * \* Created with IntelliJ IDEA.
 * \* @author: wucj
 * \* @date: 2020/9/13 17:24
 * \* @description:
 * \
 */
public class CglibOrderServiceInterceptorTest {

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(CglibOrderServiceImpl.class);
        enhancer.setCallback(new CglibOrderServiceInterceptor());
        CglibOrderServiceImpl cglibOrderService1 = (CglibOrderServiceImpl) enhancer.create();
        cglibOrderService1.save();
    }
}

总结:

1 JDK动态代理是java原生支持的,不需要任何的外部依赖,但是它只能基于接口进行代理

2 CGLIB通过继承的方式进行代理,无论对象有没有实现接口都可是代理,但是无法处理final的方法

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值