反射和代理

反射

能够分析类能力的程序叫做反射
是整个程序运行的另外一种途径,对理解整个程序运行有很好的帮助作用。反射的功能强大但相对复杂。
普通方法的调用需要一个对象,否则会报空指针。然而我们在通篇程序中都没有写过new XxxController等来构造一个方法,所以可以猜测Java中存在一个程序可以自动创建我们写的类的对象,且该程序一定不是通过new Xxx来创建的,这时可能的方式就是反射。
Java为我们提供了Class类来解决上述问题
Java运行时系统始终为所有的对象维护–个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行。通过专门的Java类访问这些信息,保存这些信息的类被称为Class,
获取Class对象方式
1.Class.forName(“全类名”):将字节码文件加载进内存,返回class对象
2.类名.class:通过类名的class获取
3.对象.getClass(): getClass()方法在object类当中定义着
获取对象内属性
Field[] fields = clz.getFields();
Field field = clz.getField(“xxx”);
获取和执行对象内方法
Method[] methods = a.getMethods();
获取一个无参的方法
Method method = a.getMethod(“xxx”);
#获取一个指定参数类型和名称的方法
Method method1 = a.getMethod(“xxx”,String.class);
method.invoke(zhangsan);
method1.invoke(zhangsan,“xxx”);

代理

代理是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.使用的一个编程思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。
静态代理:就是手写代理类的代码,工程中有代理类的源码,代理类会变以后执行。
动态代理:JDK 动态代理,JDK官方API提供,限制:只能代理实现了接口的类;CGLi,弥补了jdk的限制,可以代理任意类。
CGLib 和JDK 动态代理对比: JDK 动态代理是实现了被代理对象的接口,CGLib 是继承了被代理对象;
JDK 和CGLib 都是在运行期生成字节码,JDK 是直接写Class 字节码,CGLib 使用ASM框架写Class 字节码,Cglib 代理实现更复杂,生成代理类比JDK 效率低
静态代理和动态的本质区别
1、静态代理只能通过手动完成代理操作,如果被代理类增加新的方法,代理类需要同步新增,违背开闭原则。
2、动态代理采用在运行时动态生成代码的方式,取消了对被代理类的扩展限制,遵循开闭原则。
3、若动态代理要对目标类的增强逻辑扩展,结合策略模式,只需要新增策略类便可完成, 无需修改代理类的代码。

AOP—面向切面编程

AOP是通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
原理:JDK动态代理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值