异常
1. Java中的Exception分为哪几种?列举几种常见的异常
编译时异常和运行时异常
NullPointerException
ClassCastException
ArrayIndexOutOfBoundsException
IllegalArgumentException
2. finally一定执行吗?什么时候不被执行?
不一定
- 当程序进入try块之前就出现异常时,会直接结束,不会执行finally块中的代码
- 当程序在try块中强制退出时也不会去执行finally块中的代码,比如在try块中有System.exit(0)语句。
- 当程序意外中断,比如断电,使用stop结束线程,finally不会被执行
3. try catch中多层catch的作用
可以捕获多个异常类型,并对不同类型的异常做不同的处理
从上到下,从小到大捕捉
反射
4. Java中的反射是什么?
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
5. 反射的原理
反射就是利用加载到jvm中的.class文件来进行操作的,class文件会对外提供一个类对象,我们就可以通过这个类对象来获取类的成员变量和方法了。(.class文件中包含java类的所有信息,可以将.class中的方法,变量,构造函数等映射成 相应的 Method、Filed、Constructor 等类,这就是反射的原理。)
6. 获取一个类的Class对象的方法有哪些?
- 类名.class,通过类获取,无需创建类对象
- 对象.getClass(),需要类的对象。常用于不知道类名但是能获取对象的情况下。
- Class.forName(“全类名”),需要类的全名,需抛出异常。常用于加载配置。
7. 如何通过反射的方式获取一个对象实例?
- 首先获取一个类的Class对象,通过这个Class对象的.newInstance()方法获取,Class.newInstance(),实际调用的是无参数的构造函数进行实例化。
- 首先获取一个类的Class对象,通过这个Class对象的getDeclaredConstructor()方法获取构造函数,再通过Constructor.newInstance()方法获取,可以选择调用哪个构造函数进行实例化。
8. 反射应用场景
- 使用 JDBC 连接数据库时使用 用 Class.forName() 通过反射加载数据库的驱动程序
- Spring 框架也用到很多反射机制,比如通过 xml 配置模式装载 Bean。过程是:
- 将程序内所有 XML 或 Properties 配置文件加载到内存中;
- 在 Java 类里面解析 xml 或 properties 里面的内容,得到对应实体类的字节码、字符串以及相关的属性信息;
- 使用反射机制 , 根据这个字符串获得某个类的 Class 实例
- 动态配置实例的属性。
泛型
- 是一种不确定的数据类型,这种不确定的数据类型需要在使用这个类的时候才能够确定出来。泛型可以省略,如果省略,默认泛型是Object类型。
- 好处:消除强制类型转换
- 泛型指的是参数化类型,可以在不创建新类型的情况下,通过泛型指定的不同类型。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口和泛型方法。
- 泛型只在编译阶段有效,在编译之后程序会去泛型化。也就是说,泛型信息不会进入到运行时阶段,但它可以方便我们做编译期的类型检查。