cglib动态代理和JDK动态代理

maven依赖

cglib动态代理需要jar包支持,CGLib采用了非常底层的字节码技术。

<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
</dependency>

cglib和JDK动态代理

CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。而JDK动态代理用的是反射,代理的是接口。

cglib示例

被代理类

public class Host {public void rank(){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;public class CGproxy implements MethodInterceptor {private Object target;public void setTarget(Object target) {this.target = target;}public Object getProxy(Class targetClass){if (targetClass == null) return null;Enhancer enhancer = new Enhancer();//设置代理父类enhancer.setSuperclass(targetClass);//设置代理回调方法enhancer.setCallback(this);return enhancer.create();}public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("前置增强");Object result = method.invoke(target,objects);System.out.println("后置增强");return result;}
}

测试

public class Demo {public static void main(String[] args) {Host host = new Host();CGproxy cGproxy = new CGproxy();cGproxy.setTarget(host);Host proxy = (Host) cGproxy.getProxy(host.getClass());proxy.rank();}
}

JDK动态代理

被代理接口

public interface Rank {public void rank();
}

被代理类

public class Host implements Rank{public void rank() {System.out.println("房东租房");}
}

代理类

public class Proxyrank implements InvocationHandler {private Object target;public void setTarget(Object target) {this.target = target;}public Object getProxy(){if (target == null) return null;return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(proxy.getClass());System.out.println("前置增强");Object result = method.invoke(target,args);System.out.println("后置增强");return result;}
}

测试

public class Demo {public static void main(String[] args) {Rank rank = new Host();Proxyrank proxyrank = new Proxyrank();proxyrank.setTarget(rank);Rank rank1 = (Rank) proxyrank.getProxy();rank1.rank();}
}

cglib动态代理和JDK动态代理相关推荐

  1. AOP的底层实现-CGLIB动态代理和JDK动态代理

    AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来 ...

  2. cglib动态代理和jdk动态代理的区别

    jdk动态代理和cglib动态代理执行时都会生成行的calss文件,jdk生成一个,cglib会生成四个 Jdk动态代理生成一个文件继承proxy类实现代理接口,因为java不能多继承的特性,所以只能 ...

  3. cglib动态代理和jdk动态代理的区别与应用

    1,引入 如果从一个Controller调用Service的非事务方法a,然后在a里调用事务方法b,b事务生效吗? public void update() {updateActual();int a ...

  4. java代理(静态代理和jdk动态代理以及cglib代理)

    说到代理,脑袋中浮现一大堆代理相关的名词,代理模式,静态代理,jdk代理,cglib代理等等. 记忆特别深刻的是,一次面试中,一位面试官问我,spring的AOP核心采用的设计模式是什么什么模式,阅读 ...

  5. 静态代理和JDK动态代理

    (开发环境是MyEclipse) 静态代理示例 HellowStaticProxy代理, HellowObject被代理 HellowObject和HellowStaticProxy实现iHellow ...

  6. java静态代理和JDK动态代理

    静态代理 编译阶段就生产了对应的代理类 public interface IBussiness {void execute(); } public class BussinessImpl implem ...

  7. cglib 动态代理和 jkd 动态代理

    例子:买电脑 背景:在早年间,假如你要买台电脑你得去联系电脑生产厂商购买,随着业务规模的增加,生产的电脑越来越多,当然买的人也多,这时候对于厂家来说相关的运营成本(仓储成本.物流成本.售后服务-)也随 ...

  8. Spring 静态代理+JDK动态代理和CGLIB动态代理

    代理分为两种:静态代理 动态代理 静态代理:本质上会在硬盘上创建一个真正的物理类 动态代理:本质上是在内存中构建出一个类. 如果多个类需要进行方法增强,静态代理则需要创建多个物理类,占用磁盘空间.而动 ...

  9. JDK动态代理和Cglib的动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 最简单的是静态代理方法,即代理模式,这里就不多啰嗦了.. 重点说一下JDK的动态代理和Cglib的动态代理吧 先说JDK的,需 ...

最新文章

  1. 运维工具SaltStack
  2. Safari的CSS HACK方法
  3. 网页防止另存为,屏蔽右键,防止复制代码,防止被人frame等网页代码
  4. java 将对象转_如何将Java对象转换为C对象?
  5. PDF密码去除常用工具
  6. 以后外卖还可以买手机了!饿了么与上海迪信通达成合作
  7. WordPress 客户端软件列表
  8. linux 之静默安装oracle
  9. PHP 文件以及目录操作
  10. ETL 工具的比较:Talend,Kettle,Informatica 等
  11. UVa 1585 - Score
  12. 关于STL allocator
  13. Spark2.1.0模型设计与基本架构(下)
  14. 硬件PCB发热严重,天线信号不良的整改
  15. Inno Setup 为程序创建桌面快捷方式
  16. feifeicms 人物标签调用
  17. html加密文件怎么解密,如何取消文件的加密保护,如何解密?
  18. 蓝牙耳机无法与计算机连接,蓝牙耳机怎么连接电脑【图文教程】
  19. 监控神器Prometheus
  20. 揭秘 typedef四用途与两陷阱

热门文章

  1. 多媒体开发之wis-stream
  2. JSP页面中的pageEncoding和contentType两种属性
  3. Python基础教程---读书笔记四
  4. 如果再不要求进步,那么你就是下一个陨落的巨头
  5. 静态NAT技术三部曲
  6. MyEclipse优化浅析
  7. 2008年4月10日:超负荷的一天
  8. 模拟操作网页 webBrowser
  9. 深入分析Nginx 502 Bad Gateway和Nginx 504 Gateway(亲测)
  10. uwsgi+nginx部署django项目(有图原理的详细展示的)