Solo  当前访客:1 开始使用


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的复制文件也是进行了浅克隆;对象中的应用类型也是进行了引用的复制


标题:java基础面试题
作者:temp12138
地址:https://solo.mfyzl.icu/articles/2024/03/20/1710918033822.html

标签:
新一篇: jvm 面试题 旧一篇: 跨域