java - 动态代理

本文介绍了代理模式在软件设计中的作用,通过一个跑步的例子展示了静态代理的实现,增加了功能扩展。接着,详细解释了动态代理,包括使用CGLIB库创建代理和利用JDK内置的动态代理机制。动态代理允许在运行时动态地为对象创建代理,以实现额外的功能,如日志记录、性能监控等。
摘要由CSDN通过智能技术生成

1、代理模式

代理模式是23中设计模式中的一种,它是为了在目标对象的基础上增加额外的功能,也就是扩展对象的功能。

在编译期阶段否能决定最终的执行方法可以把代理模式分为动态代理和静态代理。

2、静态代理

我们目标是一个人在跑步,现在我们在不该原来的代码基础上,增加套马甲的功能。

定义一个接口:

public interface PersonDao {
    void run();
}

实现一个基础类:

public class Person implements PersonDao{
    @Override
    public void run(){
        System.out.println("我在跑步");
    }
}

实现一个代理类:

public class PersonProxy implements PersonDao{
    Person person;

    public PersonProxy(Person person) {
        this.person = person;
    }

    @Override
    public void run() {
        System.out.println("我先套个马甲");
        person.run();
    }
}

测试类:

    @Test
    void test4(){
        Person p1 = new Person();
        PersonProxy personProxy = new PersonProxy(p1);
        personProxy.run();
    }

3、动态代理

3.1 cglib动态代理

这个代理模式需要我们自己导包:

        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.5</version>
        </dependency>

实体类:

public class UserService {
    public void run(){
        System.out.println("我还是在跑步!!!");
    }
}

接口实现:

public class AutoMethodInterceptor implements MethodInterceptor {

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("先热个身");
        Object object = methodProxy.invokeSuper(obj, args);
        return object;
    }
}

测试:

    @Test
    void test6(){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(UserService.class);
        enhancer.setCallback(new AutoMethodInterceptor());
        UserService userService = (UserService)enhancer.create();
        userService.run();
    }
3.2 JDK动态代理

Java提供了 java.lang.reflect.Proxyjava.lang.reflect.InvocationHandler 两个类来实现JDK代理。

代理类:实现InvocationHandler

public class PersonHandler implements InvocationHandler {

    private PersonDao personDao;

    public PersonHandler(PersonDao personDao) {
        this.personDao = personDao;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("先进行热身运动");
        Object invoke = method.invoke(personDao, args);
        System.out.println("结束进行放松运动");
        return invoke;
    }
}

测试:

    @Test
    void test5(){
        Person person = new Person();
        PersonHandler personHandler = new PersonHandler(person);
        PersonDao  personProxy= (PersonDao) Proxy.newProxyInstance(
            person.getClass().getClassLoader(),
            person.getClass().getInterfaces(), 
            personHandler
        );
        personProxy.run();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值