动态代理的简单实现

@[TOC]底层原理的一些实现上代码
实现接口:

   /**
    * @Description: 会被实现的代理接口
    * @author yinxin
    * @date 2022/2/2410:40
    * @version 1.0
    */
public interface Singer {
   void sing();
}

实现类:(希望没有侵犯到张杰的姓名权)

/**
 * @author yinxin
 * @version 1.0
 * @Description: 实现类
 * @date 2022/2/2410:51
 */
public class ZhangJie implements Singer{

    private String words;

    public ZhangJie() {
    }

    public ZhangJie(String words) {
        this.words = words;
    }

    @Override
    public void sing() {
        System.out.println("ZhangJie sing: "+words);
    }
}

动态代理的实现:

/**
 * @author yinxin
 * @version 1.0
 * @Description: 动态代理的实现
 * @date 2022/2/2410:25
 */
//首先实现一个InvocationHandler,方法调用会被转发到该类的invoke()方法。
public class LogInvocationHandler implements InvocationHandler {

    public Singer singer;

    public LogInvocationHandler(Singer singer) {
        this.singer = singer;
    }

    @Override
    public Object invoke(Object o, Method method, Object[] args) throws Throwable {
        //当代理对象嗲用say方法时候触发
        Object invoke;
        if("sing".equals(method.getName())){
            //对sing方法的增强
            System.out.println("动态代理开始");
            invoke = method.invoke(singer, args);
            System.out.println("动态代理结束");
        }else {
            invoke = method.invoke(singer, args);
        }
        return invoke;
    }

    // 这里为了方便就在这个类中写主启动类测试
    public static void main(String[] args) {
        Singer zhangJie = new ZhangJie("words");
        Singer zjproxy= (Singer) Proxy.newProxyInstance(
                zhangJie.getClass().getClassLoader(),//类加载器
                new Class<?>[]{Singer.class},//代理需要实现的接口可以多个
                new LogInvocationHandler(zhangJie )//方法的实际处理者
        );
        zjproxy.sing();
    }
}

这只是一个开始像aop中提供的对方法增强的底层实现,还有很多实现大家可以以一去试着实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值