java基础面试题
* 什么是反射?
反射是在运行状态("运行时"是指程序已经启动并正在执行的状态,已经被加载到jvm中开始执行了,而不是程序的编译阶段)中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
* 什么是 Java 序列化?什么情况下需要序列化?
Java 序列化是为了保存各种对象在内存中的状态(状态就是:一个对象的属性被修改了不是默认值,或者可以被修改的一种表现),并且可以把保存的对象状态再读出来。
以下情况需要使用 Java 序列化:
- 想把的内存中的对象状态保存到一个文件中或者数据库中时候;
- 想用套接字在网络上传送对象的时候;
- 持久化时
- 想通过RMI(远程方法调用)传输对象的时候。
* 动态代理是什么?有哪些应用?
动态代理是运行时动态生成代理类。(实现InvocationHandler 接口和 Proxy 类的实例,)
动态代理的应用有 spring aop、hibernate 数据查询、测试框架的后端 mock、rpc,Java注解对象获取等。
//原生的动态代理
MyInterface realObject = new MyRealObject();//被代理的对象
MyInvocationHandler handler = new MyInvocationHandler(realObject); //实现InvocationHandler 接口的 代理类
MyInterface proxyObject = (MyInterface) Proxy.newProxyInstance(
realObject.getClass().getClassLoader(),
realObject.getClass().getInterfaces(),
handler
);//创建代理对象
proxyObject.doSomething();//用代理对象调用方法
//aop动态代理
//定义切面类
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.MyService.*(..))")
public void beforeAdvice() {
System.out.println("Before method execution: Logging...");
}
}
//开启AspectJ 自动代理
@Configuration
@ComponentScan("com.example")
@EnableAspectJAutoProxy
public class AppConfig {
// 配置类内容
}
* 怎么实现动态代理?
JDK 原生动态代理和 cglib 动态代理。JDK 原生动态代理是基于接口实现的,而 cglib 是基于继承当前类的子类实现的。
* 为什么要使用克隆?
克隆的对象可能包含一些已经修改过的属性,而 new 出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠克隆方法了。
* 如何实现对象克隆?
- 实现 Cloneable 接口并重写 Object 类中的 clone() 方法。(浅克隆只复制对象的基本类型字段+字符串的值 和引用类型字段的引用,而不复制引用类型字段指向的对象。)
- 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
// 浅克隆
@Override
public Person clone() throws CloneNotSupportedException {
return (Person) super.clone();
}
// 深克隆
public Person deepClone() throws CloneNotSupportedException {
Person clone = (Person) super.clone();
// 对引用类型字段进行深度克隆
clone.address = this.address.clone();
return clone;
}
* 深拷贝和浅拷贝区别是什么?
- 浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。
- 深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制。
完成深克隆的方法:
序列化对象:通过对象输出流将对象序列化为字节输出流,然后通过对象输入流将字节输入流中的数据写入到对象中;ObjectOutputStream、ObjectInputStream
SerializationUtils.clone(object); Apache Commons Lang
fastjson 序列化位字符串,再解析为对象
BeanUtils.copyProperties(source, target);//spring的复制文件也是进行了浅克隆;对象中的应用类型也是进行了引用的复制
废话短说