jdk动态代理实现

本文深入探讨了JDK动态代理的实现原理,包括代理模式的概念、动态代理类的生成过程及如何通过重写InvocationHandler接口的invoke方法来实现业务逻辑的前后处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说jdk动态代理模式,先来说一下什么是代理模式,顾名思义,就是别人需要做的活让其他人代理做了。比较常见的是,我需要买火车票,我现在没有办法去火车站购买,找到离我最近的火车票代理点购买火车票。而jdk实现的代理模式实现起来比较简单,重写接口方法,但是业务模块需要实现接口才能使用jdk的代理模式。重写的接口之前还需要了解一个东西,那就是java的反射机制,这里不详细说反射机制。

JDK动态代理所用到的代理类在程序调用到代理类对象时才由JVM真正创建,JVM根据传进来的 业务实现类对象 以及 方法名 ,动态地创建了一个代理类的class文件并被字节码引擎执行,然后通过该代理类对象进行方法调用。我们需要做的,只需指定代理类的预处理、调用后操作即可。代理类需要重写接口
java.lang.reflect.InvocationHandler里面的invoke()方法。

1定义业务逻辑层接口

public interface BuyFacade {
    public void addCustomer();
}

2实现业务逻辑层类

public class BuyFacadeImpl implements BuyFacade {
    @Override
    public void addCustomer() {
        System.out.println("添加一个新的用户。。。。");
    }
}

3代理类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class BuyProxy implements InvocationHandler {
    private Object trage;

    /**
     * 绑定业务对象并返回代理对象
     * @param trage
     * @return
     */
    public Object bind(Object trage) {
        this.trage = trage;//接收业务层的对象
        //通过反射机制,创建一个代理类对象实例并返回。用户进行方法调用时使用
        //创建代理对象时,需要传递该业务类的类加载器(用来获取业务实现类的元数据,在包装方法是调用真正的业务方法)、接口、handler实现类
        return Proxy.newProxyInstance(trage.getClass().getClassLoader(), trage.getClass().getInterfaces(), this);
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("执行方法之前---------");
        Object result = method.invoke(trage, args);
        System.out.println("执行方法之后---------");
        return result;
    }
}

4测试方法

public static  void  main(String[] args){
        BuyFacadeImpl buyFacadeImpl = new BuyFacadeImpl();
        BuyProxy buyProxy = new BuyProxy();
        BuyFacade buyFacade = (BuyFacade) buyProxy.bind(buyFacadeImpl);
        buyFacade.addCustomer();
    }

结果:
执行方法之前---------
添加一个新的用户。。。。
执行方法之后---------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值