1. 泛型
1.1 什么是泛型,有什么作用
使用泛型,可以增强代码的可读性以及稳定性
编译器可以对泛型参数进行检测,并且通过泛型参数可以指定传入的对象类型,如果传入其他类型的对象就会报错
1.2 什么是泛型擦除
泛型是提供给javac编译器使用的,用于限定集合的输入类型,让编译器在源代码级别上,避免向集合中插入非法数据。但编译器编译完带有泛型的java程序后,生成的class文件中不在带有泛型信息,以此使程序运行效率不受影响,这个过程称为擦除
1.3 泛型擦除机制
JVM并不知道泛型的存在,因为泛型在编译阶段就已被处理成普通的类和方法。擦除机制如下:
泛型类型没有指定具体的类型,是哦也能够Object作为原始类型
若有限定类型< T exnteds XClass >,使用限定类型XClass 作为原始类型
若有多个限定类型< T exnteds XClass1 & XClass2 >,使用第一个边界类型XClass1作为原始类型
1.4 泛型的使用方式有哪几种
泛型类、泛型接口、泛型方法
1.5 为什么泛型的效率比较高
在非泛型编程中,将简单类型作为Object传递时会引起Boxing(装箱)和Unboxing(拆箱)操作,这两个过程都是具有很大开销的。引入泛型后,就不必进行Boxing和Unboxing操作了,所以运行效率相对较高,特别在对集合操作非常频繁的系统中,这个特点带来的性能提升更加明显。
1.5 项目中哪里用到了泛型
自定义接口通用返回结果:R<T>
构建集合工具类(参考Collections中的sort、binarySearch方法)
1.6 简单写一个泛型示例
public class R<T>{
private T message;
public R(T message){
this.message = message;
}
public T getMessage(){
return this.message;
}
}
2. 反射
2.1 什么是反射
在运行状态中,能够获得这个类的所有属性和方法,并能够调用它的任意一个方法和属性,这种动态获取类的信息以及动态调用对象的方法的功能称为反射机制。
2.2 反射的核心类
- Class
- class.forName()
- 类.class
- 类实例.getClass()
- Constructor
- Method
- Field
2.3 反射的优缺点
优点:反射可以让我们的代码更加灵活,为各种框架提供开箱即用的功能提供了便利
缺点:有安全问题,比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)。另外,反射的性能也差点
2.4 反射的应用场景
像Spring、SpringBoot、MyBtais等框架中都大量用到了反射机制,这些框架中大量使用了动态代理,而动态代理的实现依赖反射
注解也用到了反射,基于反射分析类,然后获取类、属性、方法、方法参数上的注解,获取到注解之后,就可以做进一步的处理