CGLIB动态代理
CGLIB动态代理
CGLib使用字节码技术生成代理类,在JDK1.6之前比java反射效率高,到jdk1.8的时候jdk的代理效率高于cglib代理
CGLIN是第三方提供的包,需要引入jar包
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency>
代码
//火车站 public class TrainStation { public void sell() { System.out.println("火车站卖票!"); } } import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * 代理工厂 * @author lyn */ public class ProxyFactory implements MethodInterceptor { private TrainStation target = new TrainStation(); public TrainStation getProxyObject() { //创建Enhancer对象,类似于JDK动态代理的Proxy类,下一步就是设置几个参数 Enhancer enhancer = new Enhancer(); //设置父类的字节码对象 enhancer.setSuperclass(target.getClass()); //设置回调函数 enhancer.setCallback(this); //创建代理对象 return (TrainStation) enhancer.create(); } /** * @param o 代理对象 * @param method 真实对象中的方法的Method实例 * @param args 实际参数 * @param methodProxy 代理对象中的方法的method实例 * @return * @throws Throwable */ @Override public TrainStation intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("代理点收取一些服务费用(CGLIB动态代理方式)"); return (TrainStation) methodProxy.invokeSuper(o, args); } } //测试 public class ProxyClient { public static void main(String[] args) { TrainStation proxyObject = new ProxyFactory().getProxyObject(); proxyObject.sell(); } }