四、反射

四、反射

1. 什么是反射?

在这里插入图片描述

1_1. 对反射机制的理解及其用途?

反射有三种获取方式:forName、getClass、直接使用 class方式使用反射,可以获取类的实例(即类的全限定名,获取运行时类型信息);

1_2. Java中 class.forName 与 ClassLoader.loadClass 区别?在这里插入图片描述

2. 什么是序列化?什么情况下需要序列化?

如果一个对象能被序列化,那他的子类也能被序列化。
什么是序列化?如何实现 Java序列化?
把对象保存到本地的过程叫序列化(序列化到本地),从磁盘上把对象读出叫反序列化(反序列化从本地读出);(若一个对象之前是保存的,后来对象多了个 email字段,即本地保存的对象与对象不同了,在本地读出即反序列化此时与之前不同了,就引入 版本,版本就是为了防止对象不统一导致内存出错的情况。)
(序列化使用场景:用一台电脑运行两个 java程序,即 2个JVM,这2个 java程序中都创建了对象,两者能否互读(即一个 jvm能否读到另一个 jvm信息)?:两个 jvm意味着两个进程,每个进程都是受保护的,不同进程之间不能互相读取,不允许跨进程访问。若 java中一个进程想与另一个进程交互,如何交互?:用序列化,进程之间访问数据就是序列化到本地,另一个进程再去从本地读取。因为操作系统不允许跨进程访问。)

序列化的实现:
① 将需要序列化的类实现 Serializable接口;
② 然后用一个输出流(FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,再使用 ObjectOutputStream对象流对象的 WriteObject(Object obj)方法可以将参数 obj的对象写入(即保存状态);恢复则用输入流。
在这里插入图片描述
在这里插入图片描述------------------------------------------------------------------------------------------

3. 动态代理

在这里插入图片描述

动态代理(也叫JDK动态代理、JDK代理、接口代理) 与 cglib代理(也叫子类代理)

动态代理: 目标对象(即类)要实现接口,代理对象不需要实现接口,在内部自动帮忙实现接口,使用到 JDKAPI动态的在内存中创建代理对象(所以又叫接口代理、JDK代理)。使用到 API中 Proxy提供的 newProxyInstance( )方法:三个参数:

target.getClass.getClassLoader(),//目标对象的类加载器
target.getClass.getInterface(),  //目标对象的接口类型 
new InvocationHandler(){  //事件处理器 
    ...
}

cglib代理: 又叫子类代理,在内存中构建一个子类对象,实现对目标对象的扩展;要求:
① 目标对象(即类)不能是 final,否则会报错;
② 目标对象的方法是 final、static时,则不会拦截此方法(即添加的扩展内容无法得到)

在 SprigAOP编程中:(自动选择)
若加入容器的目标对象有实现接口的类,用动态代理;
若加入容器的目标对象没有实现接口的类且目标对象不是 final,用 cglib代理;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值