动态代理理解和代码展示

 

基本解释:

静态代理:
*  特点:
*  代码写死了   private UsbFactory usbFactory = new UsbFactory();
*                  float v = usbFactory.sellUsb(name);
*  若接口增加新的方法,后续的其他定义都需要进行相应的额修改,不然会报红
*
*  动态代理:
*      基于 jdk  三个重要的类 invoctionhandler  proxy  method  jd部分由invoctionhandler实现来实现对应的方法的使用
*      基于 cglib
*      特点: jdk必须要有实现的接口,cglib,可以没有但是方法不能够是final修饰的
*      他们之间的关系就是互补, cglib 是对于 jdk 的补充

静态代理:

接口usb的定义:

package dynamicproxy;

/**
 * @author liuYC
 * @ClassName SayHello
 * @Description TODO
 * @date 2021/6/15 21:35
 */
public interface Usb {

    float  sellUsb(String name);
}

商家:

package dynamicproxy;

import com.sun.org.apache.bcel.internal.generic.NEW;
import org.apache.ibatis.jdbc.Null;

/**
 * @author liuYC
 * @ClassName JD
 * @Description TODO
 * @date 2021/6/15 21:39
 * <p>
 * 商家进行售卖;调用厂家的方法:
 */
public class JD implements Usb {

    private UsbFactory usbFactory = new UsbFactory();

    public JD(UsbFactory usbFactory) {
        this.usbFactory = usbFactory;
    }

    @Override
    public float sellUsb(String name) {
        float v = usbFactory.sellUsb(name);
        System.out.println(name);
        System.out.println("jd:" + v + 20);
        return v + 20;
    }
}

 

厂家:

package dynamicproxy;

/**
 * @author liuYC
 * @ClassName UsbFactory
 * @Description TODO
 * @date 2021/6/15 21:38
 *
 * 厂家卖
 */
public class UsbFactory implements Usb {
    @Override
    public float sellUsb(String name) {
        System.out.println("UsbFactory:" + 20);
        return 20.0f;
    }
}

 

顾客购买:

package dynamicproxy;

/**
 * @author liuYC
 * @ClassName Client
 * @Description TODO
 * @date 2021/6/15 21:50
 *
 * 静态代理:
 *  特点:
 *  代码写死了   private UsbFactory usbFactory = new UsbFactory();
 *                  float v = usbFactory.sellUsb(name);
 *  若接口增加新的方法,后续的其他定义都需要进行相应的额修改,不然会报红
 *
 *  动态代理:
 *      基于 jdk  三个重要的类 invoctionhandler  proxy  method  jd部分由invoctionhandler实现来实现对应的方法的使用
 *      基于 cglib
 *      特点: jdk必须要有实现的接口,cglib,可以没有但是方法不能够是final修饰的
 *      他们之间的关系就是互补, cglib 是对于 jdk 的补充
 */
public class Client {
    public static void main(String[] args) {
        final UsbFactory usbFactory = new UsbFactory();
        final JD jd = new JD(usbFactory);
        jd.sellUsb("liyuchao");
    }

}

 

 

 

 

 

 

 

基于jdk的动态代理

在静态代理的基础上:商家和对应的client顾客类做些变化:

package dynamicproxy;

import java.lang.annotation.Target;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @author liuYC
 * @ClassName myinvoctionhandler
 * @Description TODO
 * @date 2021/6/15 22:03
 */
public class myinvoctionhandler implements InvocationHandler {
    // 需要传入的对象!
    Object target = null;
    Object res = null;

    public myinvoctionhandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        res = method.invoke(target, args);
        if (res != null) {
            float price = (float) res;
            price = price + 20;
            System.out.println("price" + price);
        }
        return null;
    }
}

顾客类:

package dynamicproxy;

import java.lang.reflect.Proxy;

/**
 * @author liuYC
 * @ClassName JdkClient
 * @Description TODO
 * @date 2021/6/15 22:08
 *
 * 基于jdk的动态代理的代码
 *
 */
public class JdkClient {
    public static void main(String[] args) {
         UsbFactory usbFactory = new UsbFactory();
         myinvoctionhandler myinvoctionhandler = new myinvoctionhandler(usbFactory);
        Usb proxy = (Usb)Proxy.newProxyInstance(usbFactory.getClass().getClassLoader(), usbFactory.getClass().getInterfaces(), myinvoctionhandler);
        proxy.sellUsb("liyucoa");
    }
}

 

 

基于cglib的动态代理:接口的声明也不需要了,但是不要声明为final

这个类得声明:大家可以看作是 静态代理中的 interface

package dynamicproxy.cglib;

/**
 * @author liuYC
 * @ClassName Sell
 * @Description TODO
 * @date 2021/6/15 22:19
 */
public class Sell {
    void sell() {
        System.out.println("sell ising sell:" +
                "");
    }
}

 MethodInterceptor类似于jdk的invocationhandler:

package dynamicproxy.cglib;


import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

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

/**
* @ClassName dafd
* @Description TODO
* @author liuYC
* @date 2021/6/15 22:31
*
*/
public class myintercepter implements MethodInterceptor {
    // 需要传入的对象!
    Object target = null;
    Object res = null;

    public myintercepter(Object target) {
        this.target = target;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        res = method.invoke(target, args);
        if (res != null) {
            float price = (float) res;
            price = price + 20;
            System.out.println("price" + price);
        }
        return null;
    }
}

顾客类:
 

package dynamicproxy.cglib;

import dynamicproxy.Usb;
import dynamicproxy.UsbFactory;
import dynamicproxy.myinvoctionhandler;
import org.springframework.cglib.proxy.Enhancer;

import java.lang.reflect.Proxy;

/**
 * @author liuYC
 * @ClassName JdkClient
 * @Description TODO
 * @date 2021/6/15 22:08
 * <p>
 * 基于cglib 的动态代理的代码
 * 不需要对应的有实现 interface的情况出现!
 */
public class CglibClient {
    public static void main(String[] args) {
        final Sell sell = new Sell();
        final myintercepter myintercepter = new myintercepter(sell);
        final Sell cglib = (Sell) Enhancer.create(Sell.class, myintercepter);
        cglib.sell();
    }
}

参考的视频是:

动力节点的动态规划,B站一搜应该就可以的哈:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

specialApe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值