进阶技术题

进阶技术面试题

1.类加载器加载类的时机是什么时候?
类被实例化:当程序创建类的实例时,类加载器会加载该类。例如,通过new关键字创建对象时,所属类会被加载。
静态访问:当程序访问类的静态成员(静态变量或静态方法)时,类加载器会加载该类。
反射:通过反射机制,程序可以在运行时动态地加载和使用类,这时类加载器会加载相应的类。
继承、实现:当一个类继承另一个类或者实现了接口时,类加载器会加载被继承的类或者实现的接口。

2.我们学过哪些常见的类加载器,它们在加载类的的时候遵从什么模式?
BootStrapClassLoader
ExtClassLoader
AppClassLoader
双亲委派模式

3.反射有什么作用?查阅资料了解反射的应用场景并了解反射机制的优缺点。
反射是指程序在运行时可以访问、检测和修改其本身状态或行为的一种能力。Java中的反射机制提供了一系列的API,允许程序在运行时检查类、实例化对象、调用方法、访问和修改字段等。反射的作用包括:
应用场景
框架和库:许多Java框架和库(如Spring、Hibernate)使用反射来实现依赖注入、AOP、ORM等功能,从而提高了灵活性和可扩展性。
工具和调试:开发工具和调试器可以使用反射来分析类的结构、调用栈信息、检查对象的状态等,有助于开发和调试。
动态代理:反射可以用来创建动态代理,实现AOP编程、远程方法调用等。
序列化和反序列化:Java中的序列化和反序列化机制通常使用反射来实现。
动态加载类和资源:一些应用需要在运行时动态加载类和资源,反射提供了这种能力。
优点
灵活性:反射提供了动态操作类和对象的能力,使得程序具有更高的灵活性和可扩展性。
代码复用:反射可以实现通用的代码操作,提高了代码的复用性。
框架和库:许多框架和库依赖于反射来实现其功能,从而提供了丰富的功能和灵活性。
缺点
性能开销:与直接调用相比,反射操作通常会带来一定的性能开销,因为它需要在运行时进行动态检查和调用。
安全性:反射操作绕过了访问控制,可能导致不安全的操作,因此需要谨慎使用。
可读性:反射使得代码的可读性降低,因为在编译时无法确定类的结构和方法的调用

4.反射如何获取Class类对象?多次获取Class类对象会是同一个对象吗?
Class.forName();
类.class;
对象.getClass();
在Java中,对于同一个类,无论通过哪种方式获取Class类对象,都将得到同一个对象。也就是说,多次获取同一个类的Class对象会得到相同的对象实例。

5.反射可以获取类中的私有属性吗?如何获取?
可以 getDeclaredField()//获取私有属性的方法
setAccessible(true)//设置为可访问
6.枚举和类的区别是什么?举例完成对枚举的使用。
实例数量:
类可以有多个实例,并且可以根据需要进行实例化。
枚举是有限实例的集合,每个枚举常量在定义时就确定了,无法在运行时动态添加或删除。
继承:
类可以继承自其他类,并且可以实现多个接口。
枚举不能被继承,但可以实现接口。
实例化:
类的实例化是通过new关键字创建对象。
枚举的实例是在定义枚举类型时列出的常量,例如enum Season {SPRING, SUMMER, AUTUMN, WINTER}。
用途:
类通常用于表示一类对象,可以有多个实例,每个实例可能有不同的状态。
枚举通常用于表示一组相关的常量,如星期几、季节等。
7.举例说明类加载器的双亲委派机制。
类加载器的双亲委派机制是指在Java中,类加载器在加载类时会按照一定的委派顺序向上委派给父类加载器进行加载,直到最顶层的启动类加载器(Bootstrap ClassLoader)为止。这个机制可以有效避免重复加载已经被加载过的类,确保类的唯一性和安全性。
8.Java反射创建对象效率高还是new创建对象效率高?
在Java中,使用new关键字创建对象通常比使用反射创建对象效率更高。这是因为反射涉及到动态类型检查、方法查找等开销,而直接使用new关键字创建对象是静态绑定的,效率更高。
动态性:反射允许在运行时动态地获取类的信息、调用方法、访问字段等,这种动态性带来了额外的开销,而直接使用new是静态的、编译时决定的。
类型检查:使用反射创建对象需要进行类型检查,以确保类型的正确性,而直接使用new时,类型检查是在编译时完成的。
方法查找:通过反射调用构造函数需要进行方法查找和解析,而直接使用new时,编译器已经知道了构造函数的确切位置。
尽管反射创建对象的效率较低,但反射在某些情况下仍然非常有用,例如在框架、库和工具的设计中。反射提供了动态性和灵活性,使得可以在运行时动态地操作类和对象。在许多情况下,这种灵活性可以弥补一些性能上的损失。
9.JVM为什么采用双亲委派机制?
类的一致性:双亲委派机制可以确保类库的一致性。当一个类加载器需要加载某个类时,它会先委托给其父类加载器进行加载,这样可以避免在不同的类加载器中出现同名但不同版本的类,保证了类的唯一性和一致性。
安全性:通过双亲委派机制,可以避免恶意类的加载。如果没有双亲委派机制,恶意类可以伪装成系统类库中的类,并替换系统类库中的类,从而导致安全风险。
避免重复加载:双亲委派机制可以避免类的重复加载。当一个类加载器需要加载某个类时,它会先询问其父类加载器是否已经加载了该类,如果父类加载器已经加载了该类,就不再重复加载,避免了类的重复存在。
保护核心类库:Java的核心类库由启动类加载器加载,而启动类加载器是由JVM实现提供的,因此可以保护核心类库不受用户自定义类的影响。
10.查阅资料了解类装载的执行过程?
加载: 当程序中需要使用某个类时,Java虚拟机会首先查找并加载该类。加载过程由类加载器完成,类加载器首先会检查该类是否已经加载,如果没有加载,则尝试加载该类。
链接:在链接阶段,类加载器会执行三项工作:验证、准备和解析。验证阶段确保被加载的类符合JVM规范,准备阶段为类的静态变量分配内存并设置默认初始值,解析阶段将类、接口、字段和方法的符号引用解析为直接引用。
初始化:在初始化阶段,如果类具有超类,JVM将先初始化其超类。接着,执行静态变量的初始化和静态代码块的执行。这是类加载过程的最后一个阶段。
垃圾回收机制

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值