JDK动态代理简单使用

1、静态代理的简单使用

/**
 * 厂家、商家都要实现的功能
 */
public interface UsbSell {

    float sell(int amount);

}
/**
 * 厂家1,目标类
 */
public class UsbKingFactory implements UsbSell {
    @Override
    public float sell(int amount) {
        //设置售卖的价格
        return 85.0f;
    }
}
/**
 * 商家1,代理类
 */
public class Business1 implements UsbSell {

    //声明 商家代理的厂商是谁
    private UsbKingFactory usbKingFactory = new UsbKingFactory();

    @Override
    public float sell(int amount) {
        //告诉厂家需要几个
        //目标类的方法
        float price = usbKingFactory.sell(amount);
        //商家进行加价
        //商家对除了厂商之外的,进行的一些操作就属于增强功能
        price = price+(25*amount);
        //最终的价格
        return price;
    }
}
/**
 * 商店
 */
public class ShopMain {

    public static void main(String[] args) {
        Business1 business1 = new Business1();
        float price = business1.sell(1);
        System.out.println("通过商家1,购买的价格为:"+price);
    }

}

2、动态代理

/**
 * 厂家、商家都要实现的功能
 */
public interface UsbSell {

    float sell(int amount);

}
/**
 * 厂家1
 */
public class UsbKingFactory implements UsbSell {
    @Override
    public float sell(int amount) {
        //设置售卖的价格
        //目标方法
        System.out.println("目标类中,执行sell目标方法");
        return 85.0f;
    }
}
/**
 * 必须实现InvocationHandler接口,完成代理类要做的功能
 * 1、调用目标方法
 * 2、功能增强
 */
public class MySellHandler implements InvocationHandler {

    private Object target = null;

    //动态代理:目标对象是活动的,不是固定的,需要传入进来
    //传入是谁,就给谁创建代理
    public MySellHandler(Object target) {
        //给目标对象赋值
        this.target = target;
    }

    /**
     *
     * @param proxy   jdk创建的代理对象,无需赋值
     * @param method 目标类中的方法,jdk提供method对象
     * @param args   目标类中方法的参数,jdk提供
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //原来静态代理中实现的方法,在invoke方法中实现
        Object res = null;
        //执行目标方法
        res = method.invoke(target, args);
        //执行完目标方法后,做的一系列操作都是增强的意思
        if (res != null) {
            Float price = (Float) res;
            price = price + 25;
            res = price;
        }
        System.out.println("商家返利.....");
        return res;
    }
}
/**
 * 商店
 */
public class ShopMain {

    public static void main(String[] args) {
        //1、创建目标对象
        UsbSell factory = new UsbKingFactory();
        //2、创建InvocationHandler对象
        InvocationHandler handler = new MySellHandler(factory);
        //3、创建代理对象
        //ClassLoader loader:类加载器,负责向内存中加载对象,目标对象的类加载器
        //Class<?>[] interfaces:目标对象实现的接口
        //InvocationHandler h:代理类完成的功能
        //返回一个代理类
        UsbSell proxy = (UsbSell) Proxy.newProxyInstance(
                factory.getClass().getClassLoader(),
                factory.getClass().getInterfaces(),
                handler);
        //4、通过代理执行方法
        System.out.println("jdk动态代理创建的对象" + proxy.getClass().getName());
        float price = proxy.sell(1);
        System.out.println("通过动态代理对象,调用方法:" + price);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值