jdk 动态代理是代理模式的一种实现方式,其只能代理接口。

    实现步骤:
    1、新建一个接口,作为目标接口。
    2、为接口创建一个实现类,是目标类。
    3、创建类实现 java.lang.reflect.InvocationHandler 接口,调用目标方法并增加其他功能代码。
    4、创建动态代理对象,使用 Proxy.newProxyInstance() 方法,并把返回值强制转为接口类型。

    idea 创建 java project
    工程名称:ch02-dynamicproxy
    (**1**) 定义目标接口

    1. //接口
    2. public interface UsbSell {
    3. public abstract float sell(int amount);
    4. }

    (**2**) 定义目标接口实现类

    1. //接口实现类
    2. class UsbFactory implements UsbSell {
    3. @Override
    4. public float sell(int amount) {
    5. System.out.println("工厂类执行啦!");
    6. return 70.0F;
    7. }
    8. }

    (**3**) 定义调用处理程序
    调用处理程序是实现了 InvocationHandler 的类,在 invoke 方法中增加业务功能。还需要创建有参构造,参数是目标对象。为的是完成对目标对象的方法调用。

    1. class MySellHander implements InvocationHandler {
    2. //得到传入的对象
    3. private Object object = null;
    4. public MySellHander() {
    5. }
    6. //使用构造方法得到目标对象,赋值非 private Object object;
    7. public MySellHander(Object object) {
    8. this.object = object;
    9. }
    10. @Override
    11. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    12. //执行目标方法.传入方法所在类的对象,与方法的参数,得到方法的返回值
    13. Object result = method.invoke(object, args);
    14. //通过 返回值 增强方法。(增加价格)
    15. if (result != null) {
    16. float price = (float) result;
    17. result = price + 25;
    18. }
    19. return result;
    20. }
    21. }


    4) 创建动态代理对象**

    1. lass TestHander {
    2. public static void main(String[] args) {
    3. //创建代理对象
    4. UsbSell usbFactory = new UsbFactory();
    5. //创建调用处理器
    6. InvocationHandler mySellHander = new MySellHander(usbFactory);
    7. //创建jdk动态代理
    8. UsbSell usbSell = (UsbSell)Proxy.newProxyInstance(usbFactory.getClass().getClassLoader(),
    9. usbFactory.getClass().getInterfaces(),
    10. mySellHander);
    11. //通过代理对象执行业务
    12. float price = usbSell.sell(1);
    13. System.out.println(price);
    14. }
    15. }