cglib动态代理和JDK动态代理
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动态代理相关推荐
- AOP的底层实现-CGLIB动态代理和JDK动态代理
AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来 ...
- cglib动态代理和jdk动态代理的区别
jdk动态代理和cglib动态代理执行时都会生成行的calss文件,jdk生成一个,cglib会生成四个 Jdk动态代理生成一个文件继承proxy类实现代理接口,因为java不能多继承的特性,所以只能 ...
- cglib动态代理和jdk动态代理的区别与应用
1,引入 如果从一个Controller调用Service的非事务方法a,然后在a里调用事务方法b,b事务生效吗? public void update() {updateActual();int a ...
- java代理(静态代理和jdk动态代理以及cglib代理)
说到代理,脑袋中浮现一大堆代理相关的名词,代理模式,静态代理,jdk代理,cglib代理等等. 记忆特别深刻的是,一次面试中,一位面试官问我,spring的AOP核心采用的设计模式是什么什么模式,阅读 ...
- 静态代理和JDK动态代理
(开发环境是MyEclipse) 静态代理示例 HellowStaticProxy代理, HellowObject被代理 HellowObject和HellowStaticProxy实现iHellow ...
- java静态代理和JDK动态代理
静态代理 编译阶段就生产了对应的代理类 public interface IBussiness {void execute(); } public class BussinessImpl implem ...
- cglib 动态代理和 jkd 动态代理
例子:买电脑 背景:在早年间,假如你要买台电脑你得去联系电脑生产厂商购买,随着业务规模的增加,生产的电脑越来越多,当然买的人也多,这时候对于厂家来说相关的运营成本(仓储成本.物流成本.售后服务-)也随 ...
- Spring 静态代理+JDK动态代理和CGLIB动态代理
代理分为两种:静态代理 动态代理 静态代理:本质上会在硬盘上创建一个真正的物理类 动态代理:本质上是在内存中构建出一个类. 如果多个类需要进行方法增强,静态代理则需要创建多个物理类,占用磁盘空间.而动 ...
- JDK动态代理和Cglib的动态代理
2019独角兽企业重金招聘Python工程师标准>>> 最简单的是静态代理方法,即代理模式,这里就不多啰嗦了.. 重点说一下JDK的动态代理和Cglib的动态代理吧 先说JDK的,需 ...
最新文章
- 运维工具SaltStack
- Safari的CSS HACK方法
- 网页防止另存为,屏蔽右键,防止复制代码,防止被人frame等网页代码
- java 将对象转_如何将Java对象转换为C对象?
- PDF密码去除常用工具
- 以后外卖还可以买手机了!饿了么与上海迪信通达成合作
- WordPress 客户端软件列表
- linux 之静默安装oracle
- PHP 文件以及目录操作
- ETL 工具的比较:Talend,Kettle,Informatica 等
- UVa 1585 - Score
- 关于STL allocator
- Spark2.1.0模型设计与基本架构(下)
- 硬件PCB发热严重,天线信号不良的整改
- Inno Setup 为程序创建桌面快捷方式
- feifeicms 人物标签调用
- html加密文件怎么解密,如何取消文件的加密保护,如何解密?
- 蓝牙耳机无法与计算机连接,蓝牙耳机怎么连接电脑【图文教程】
- 监控神器Prometheus
- 揭秘 typedef四用途与两陷阱