泛型和反射

本文详细介绍了Java中的泛型概念、擦除机制及其在提高代码效率中的作用,同时探讨了反射的定义、核心类、优缺点及应用场景,如Spring框架的动态代理和注解处理。
摘要由CSDN通过智能技术生成

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等框架中都大量用到了反射机制,这些框架中大量使用了动态代理,而动态代理的实现依赖反射

注解也用到了反射,基于反射分析类,然后获取类、属性、方法、方法参数上的注解,获取到注解之后,就可以做进一步的处理

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让我再学一分钟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值