jdk/cglib动态代理学习笔记

jdk动态代理:

  • 基于接口实现,因此若目标类没有实现接口,则这种方式失效,需使用cglib动态代理实现。

jdk动态代理使用步骤:

  1. 创建目标接口
  2. 创建目标类,实现目标接口
  3. 创建代理类,实现InvocationHandler接口
  4. 在具体使用处通过Proxy类获取代理对象,利用代理对象实现目标类的功能

aop:aop是面向切面编程,主要是指对功能增强不需要修改源代码。
下面以aop来介绍上述过程:

1.创建目标接口

interface Service {
    void add();

    void update();
}

2.创建目标类,实现目标接口

class ServiceTarget implements Service{

    public void add() {
        System.out.println("target add .................");
    }

    public void update() {
        System.out.println("target update ..................");
    }
}

3.创建代理类,实现InvocationHandler接口

public class ProxyService implements InvocationHandler{

    private Object target;
    public ProxyService(Object target) {
        super();
        this.target = target;
    }

    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {

        System.out.println("before...............");

        Object ret = method.invoke(target, args);
        System.out.println("after................");

        return ret;
    }
}

4.在具体使用处通过Proxy类获取代理对象,利用代理对象实现目标类的功能

public class Test {

    public static void main(String[] args) {

        Service service = new ServiceTarget();
        ProxyService proxy = new ProxyService(service);

        Service proxyService = 
                (Service) Proxy.newProxyInstance
                (service.getClass().getClassLoader(),
                service.getClass().getInterfaces(), proxy);

        proxyService.add();
        System.out.println();
        proxyService.update();
    }
}

执行结果
这里写图片描述

cglib动态代理:

  • apache的一个开源项目
    这里写图片描述
  • 基于继承实现,使用时需导入cglib.jar和asm.jar

cglib动态代理具体使用步骤(以aop为例):

  1. 创建目标类
  2. 创建代理类,实现MethodInterceptor接口
  3. 创建一个工厂,用于创建增强后的对象
  4. 在具体使用处通过工厂创建代理对象,实现目标类的功能

下面给出具体代码:

1.创建目标类

class Base {
    public void add() {
        System.out.println("add...............");
    }
}

2.创建代理类,实现MethodInterceptor接口

class CglibProxy implements MethodInterceptor {

    public Object intercept(Object arg0, Method arg1, Object[] arg2,
            MethodProxy arg3) throws Throwable {

        System.out.println("before............");
        arg3.invokeSuper(arg0, arg2);
        System.out.println("after..............");

        return null;
    }
}

3.创建一个工厂,用于创建增强后的对象

class BaseFactory {

    public static Base getInstance(CglibProxy proxy) {

        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Base.class);

        enhancer.setCallback(proxy);

        Base base = (Base) enhancer.create();

        return base;
    }
}

4.在具体使用处通过工厂创建代理对象,实现目标类的功能

public class Test {

    public static void main(String[] args) {

        CglibProxy proxy = new CglibProxy();
        Base base = BaseFactory.getInstance(proxy);
        base.add();
    }
}

执行结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值