反射

1.什么是反射?

反射是在运行状态下,对于任意一个类,都能知道这个类的所有属性和方法;对于任何一个对象,都能调用它的任何一个方法和属性

这种动态获取的信息以及动态调用对象的方法的功能被称为Java语言的反射机制

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

java序列化是为了保存各种对象在内存中的状态,并且可以把保存的对象状态再读取出来
以下情况需要使用Java序列化:

  • 想把内存中的对象状态保存到一个文件中或者数据库中的时候
  • 想用套接字在网络上传送对象的时候
  • 想通过RMI(远程方法调用)传输对象的时候

3.动态代理是什么?有哪些应用?

动态代理是运行时动态生成代理类
动态代理的应用有spring aop,hibernate数据查询,测试框架的后端mock,rpc,java注解对象获取等

4.怎么实现动态代理?

JDK原生动态代理和cglib动态代理,jdk原生动态代理是基于接口实现的,而cglib是基于继承当前类的子类实现的

对象拷贝

1.为什么要使用克隆?

克隆的对象可能包含一些已经修改过的属性,对new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的状态时就靠克隆方法了

2.如何实现对象克隆?

  • 实现Cloneable接口,并重写Object类中的Clone()方法
  • 实现serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆

Java中 Cloneable 、Serializable 接口详解

3.深拷贝和浅拷贝区别是什么?

浅克隆:当对象被复制时只复制它本身的和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制
深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制
Java如何复制对象

4.Cloneable 、Serializable 接口详解

Cloneable接口
java中一个类要实现clone功能,必须实现Cloneable接口,否则调用clone时会报异常
java中所有类都继承Object类,而在此类中有一个clone方法,这个方法会返回Object对象的一个拷贝
1.拷贝对象有返回值,返回值是一个新的对象,而非原对象的引用
2.拷贝对象与new操作符返回的新对象的区别是这个拷贝已经包含了一些对象修改后的信息,而非对象的初始信息

如果一个类只重写了clone方法,而没有实现Cloneable接口,那么调用会报异常,也就是说Cloneable接口是合法调用clone的标识
面试_反射和对象拷贝
注意点:

  • 是为了实现clone功能,CloneClass类实现了Cloneable接口,这个接口属于java.lang 包,java.lang包已经被缺省的导入类中,所以不需要写成java.lang.Cloneable;
  • 重载clone方法
  • 在clone中调用super.clone,这也就意味无论clone类的继承结构是什么样子,super.clone直接或间接调用java.lang.Object类的clone()方法。

Object类的clone()方法是一个native方法,native方法的效率一般来说都是远高于java中的非native方法。这也解释了为 什么要用Object中clone()方法而不是先new一个对象,然后把原始对象中的信息赋到新对象中,虽然这也实现了clone功能,但效率较低。

Object类中的clone()方法还是一个protected属性的方法。这也意味着如果要应用clone()方法,必须继承Object类,在 Java中所有的类是缺省继承Object类的,也就不用关心这点了。

然后重载clone()方法。还有一点要考虑的是为了让其它类能调用这个clone 类的clone()方法,重载之后要把clone()方法的属性设置为public。

注意:对象的复制不用使用=
面试_反射和对象拷贝
当执行clz2=clz时,clz2原本的引用地址会变成跟clz一样,即clz2和clz成了同一个对象.


Serializable接口
Serializable接口中一个成员函数或者成员变量都没有,这个接口的作用是实现序列化,那什么是序列化?

序列化:
对象的寿命通常随着生成该对象的程序的终止而终止,而有时候需要把内存中的各种对象的状态保存下来,并且可以在需要时将对象恢复,java提供了一种保存对象状态的机制,也就是序列化

java序列化技术是将一个对象的状态写入一个byte流里,并且可以从其他地方把该byte流中的数据读取出来(反序列化)

什么时候需要序列化
想把内存中的对象状态保存到一个文件中或者数据库中的时候
想把对象通过网络进行传播的时候

如何序列化
只要一个类实现Serializable接口,那么这个类就可以序列化了。

相关文章:

  • 2022-12-23
  • 2021-09-26
  • 2022-12-23
  • 2021-12-31
  • 2021-12-27
  • 2022-12-23
  • 2022-01-10
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-02-10
  • 2021-12-09
  • 2022-03-02
  • 2022-12-23
  • 2021-07-14
相关资源
相似解决方案