代码: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