动态代理是基于什么原理?
反射
反射最大的作用之一就在于我们可以不在编译时知道某个对象的类型,而在运行时通过提供完整的”包名+类名.class”得到。
注意:不是在编译时,而是在运行时。代理模式(通过代理静默地解决一些业务无关的问题,比如远程、安全、事务、日志、资源、关闭……让应用开发者可以只关心他的业务)
静态代理:事先写好代理类,可以手工编写,也可以用工具生成。缺点是每个业务类都要
对应一个代理类,非常不灵活。
动态代理:运行时自动生成代理对象。缺点是生成代理代理对象和调用代理方法都要额外
花费时间。
JDK动态代理:基于Java反射机制实现,必须要实现了接口的业务类才能用这种办法生
成代理对象。新版本也开始结合ASM机制。
CGLIB动态代理:基于ASM机制实现,通过生成业务类的子类作为代理类。不能应用到被代理对象的final方法上。
功能:
•在运行时能判断任意一个对象所属的类。
•在运行时能构造任意一个类的对象。
•在运行时判断任意一个类所具有的成员变量和方法。
•在运行时调用任意一个对象的方法。
说大白话就是,利用Java反射机制我们可以加载一个运行时才得知名称的class,获悉其构造方法,并生成其对象实体,能对其fields设值并唤起其methods。