30 June 2020

代码:https://github.com/gre2/wuleiDesignPatterns/tree/master/src/main/java/com/wl/prox

JDK

  • 静态代理

    main方法,调用黄牛买票,黄牛内部调用吴磊买票

  • 动态代理

    • 代理类黄牛实现InvocationHandler接口,重写invoke方法

      method:public abstract void com.wl.proxy.jdk.common.TicketInterface.findTicket()

      方法.invoke(被代理对象,参数),执行invoke会走到被代理对象的方法中

      Object object = method.invoke(wuleiTicket, args);
      
    • jdk代理生成一个新类继承Proxy并且实现接口,实现代理类的全部方法,获取被代理对象的引用

      TicketInterface ticketInterfaceA = (TicketInterface) Proxy.newProxyInstance(WuleiTicket.class.getClassLoader(), WuleiTicket.class.getInterfaces(), new HuangNiuDynamicTicket(new WuleiTicket()));
      System.out.println("代理对象的class是:" + ticketInterfaceA.getClass());
      ticketInterfaceA.findTicket();
      
  • 手写动态代理

    代码

CGLIB

public class HuangNiuCglibTicket implements MethodInterceptor {


    public Object getInstance(Class clazz) throws Exception {
        //Enhancer类是CGLib中的一个字节码增强器,它可以方便的对你想要处理的类进行扩展,Enhancer-增强器
        Enhancer enhancer = new Enhancer();
        //生成的子类,继承哪个父类
        enhancer.setSuperclass(clazz);
        //设置回调
        enhancer.setCallback(this);
        //生成源代码,编译class,加载到内存,返回被代理对象的子类
        return enhancer.create();
    }

    @Override
    public Object intercept(Object instance, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        //Object为由CGLib动态生成的代理类实例,MethodProxy为生成的代理类对方法的代理引用
        System.out.println("我是cglib黄牛,我可以帮买票");
        methodProxy.invokeSuper(instance, args);
        System.out.println("我是cglib黄牛,票已到手");
        return null;
    }
}
WangMinTicket wangMinTicket = (WangMinTicket) new HuangNiuCglibTicket().getInstance(WangMinTicket.class);
        wangMinTicket.findTicket();s


blog comments powered by Disqus