动态代理详细代码详解

package com.hmh;

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

// 测试类
/*
    1 Proxy类 :
        public static Object newProxyInstance (
              ClassLoader loader,
              Class<?>[] interfaces,
              InvocationHandler h ) 获取代理对象的方法

            - 返回值:该方法返回就是动态生成的代理对象
            - 参数列表说明:
              1. ClassLoader loader 	- 定义代理类的类加载器
              2. Class<?>[] interfaces 	- 代理类要实现的接口列表,要求与被代理类的接口一样。
              3. InvocationHandler h 	- 就是具体实现代理逻辑的接口

    2 InvocationHandler接口
        public Object invoke(Object proxy, Method method, Object[] args);
        1. 返回值:方法被代理后执行的结果。
        2. 参数列表:
           1. proxy  - 就是代理对象
           2. method - 代理对象调用的方法
           3. args   - 代理对象调用方法传入参数值的对象数组.
 */
public class proxy {
    public static void main(String[] args) {
        // 代理角色是动态生成
        // public static Object newProxyInstance ( ClassLoader loader, Class<?>[] interfaces,InvocationHandler h ) : 获取代理对象的方法
        // Proxy.newProxyInstance( 代理角色类加载可以写被代理角色的类加载器即可 , 被代理角色实现的所有接口 , 处理器 )

        // 创建  被代理角色
        BaoQiang baoQiang = new BaoQiang();
        // 拿到代理角色的类加载
        ClassLoader classLoader = baoQiang.getClass().getClassLoader();
        // 被代理角色实现的所有接口
        Class<?>[] interfaces = baoQiang.getClass().getInterfaces();

        // 创建的是代理角色
        Star songZe = (Star) Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandlerImpl(baoQiang));
        double result = songZe.liveShow(1000);
        songZe.sleep();

    }
}

// 定义的是处理器的实现类
class InvocationHandlerImpl implements InvocationHandler {

    private BaoQiang baoQiang;

    public InvocationHandlerImpl(BaoQiang baoQiang) {
        this.baoQiang = baoQiang;
    }

    /*
            invoke方法什么时候会执行 ?
            代理角色调用方法就会触发invoke执行

            proxy : 代理对象
            method : 代理角色调用的方法
            args : 代理角色调用方法传入的参数
         */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        // 对方法进行拦截 , 实现前后增强
        if (method.getName().equals("liveShow")) {
            // 前增强
            System.out.println("宋一宝强拉了一个真人秀活动,获得佣金" + (double) args[0] * 0.8);

            // 被代理对象调用方法
            result = method.invoke(baoQiang, (double) args[0] * 0.2);

            // 后增强
            System.out.println("宋一帮宝强把" + result + "存了起来...");
        } else if (method.getName().equals("sleep")) {
            // 拦截的是sleep
            method.invoke(baoQiang);

        }
        return result;
    }
}


// 1 抽象角色
interface Star {
    public double liveShow(double money);

    public void sleep();

    // 1000方法
}

// - 定义被代理角色(宝强)
class BaoQiang implements Star {
    @Override
    public double liveShow(double money) {
        System.out.println("宝强参加了一个真人秀的活动 , 赚了" + money + "钱");
        return money;
    }

    @Override
    public void sleep() {
        System.out.println("宝强累了, 需要睡觉....");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值