泛型、注解、反射

本文介绍了Java泛型的概念、优点,如类型安全、提高代码可读性和重用性,并探讨了泛型擦除和注解的作用。同时,深入解析了Java反射机制,包括其原理、优缺点及应用场景,如框架设计、单元测试和动态代理等。
摘要由CSDN通过智能技术生成

泛型

概念

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

优点:

  1. 在编译的时候检查类型安全;
    使用泛型可以在编译时期进行类型检查,从而避免在运行时期发生类型错误。泛型可以在编译时期捕获错误,从而提高了程序的稳定性和可靠性。
  2. 避免了源代码中的许多强制类型转换,增加可读性;
    使用泛型可以使代码更加可读、清晰。通过泛型,可以更好地表达代码的意图,避免了使用Object等不具有明确含义的类型。
  3. 提高了代码的重用性;
    可以在不改变代码的情况下创建多个不同类型的对象。例如,使用List和List可以创建不同类型的列表,而不需要为每种类型编写不同的代码。

泛型擦除

泛型的代码只存在于编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,我们称之为类型擦除。

无限制类型擦除

当在类的定义时没有进行任何限制,那么在类型擦除后将会被替换成Object,例如<T>、<?>都会被替换成Object。

有限制类型擦除

当类定义中的参数类型存在上下限(上下界),那么在类型擦除后就会被替换成类型参数所定义的上界或者下界,例如<? extend Person>会被替换成Person,而<? super Person>则会被替换成Object。

注解

注解是告知编译器要做什么事情的说明,在程序中可以对任何元素进行注解,包括Java包、类、构造方法、域、方法、参数以及局部变量。

  • 编写文档——通过注解中标识的元数据可以生成doc文档,这是最常见的,也是java 最早提供的注解。常用的有@param @return 等
  • 代码分析——通过注解中标识元数据对代码进行分析。跟踪代码依赖性,实现替代配置文件功能。
  • 编译检查——通过注解中标识的元数据,让编译器能够实现基本的编译检查,例如@Override重写,如果这个方法并不是覆盖了超类方法,则编译时就能检查出。

反射

原理

Java反射机制是指在运行时动态地获取一个类的信息并能够操作该类的属性和方法的能力。Java反射机制使得程序能够在运行时借助Class类的API来操作自身的属性和方法,从而大大增强了Java的灵活性和可扩展性。

优缺点

优点:

  1. 提高了程序的灵活性:Java反射机制可以在运行时获取和操作类的信息,使程序具有更好的灵活性和扩展性。
  2. 减少了代码的重复性:Java反射机制可以动态地获取和操作类的信息,减少了代码的重复性。
  3. 提高了程序的可维护性:Java反射机制可以使程序的结构更加清晰明了,提高了程序的可维护性。

缺点:

  1. 性能较低:Java反射机制是通过运行时动态获取和操作类的信息,性能较低。
  2. 安全性问题:Java反射机制可以访问和操作类的所有信息,存在安全性问题。

如何获取

//1. 通过类名.class获取 
class s = SubjectService.class//2.通过Class.forName名获取
class s = Class.forName(SubjectService)//3.通过对象.getclass获取
class s = data.getClass()//4.通过类加载器获取
ClassLoader classLoader = Practice0.class.getClassLoader();
 Class s = classLoader.loadClass("全类名");

比较四种获取方式的区别?通过类加载器获取的方式不常用,在此不做比较。

  1. 类名.class:JVM将使用类装载器,将类装入内存(前提是:类还没有装入内存),不做类的初始化工作,返回Class的对象。
  2. Class.forName(“类名字符串”):装入类,并做类的静态初始化,返回Class的对象。
  3. 实例对象.getClass():对类进行静态初始化、非静态初始化;返回引用运行时真正所指的对象(子对象的引用会赋给父对象的引用变量中)所属的类的Class的对象。

应用场景

  1. 框架设计:在框架设计中,我们通常需要使用反射技术来解耦,使框架可扩展和灵活。
  2. 单元测试:在单元测试中,我们可以使用反射技术来访问私有或受保护的类成员,使测试更加全面。
  3. 动态代理:使用反射技术可以创建动态代理对象,从而可以在运行时期代理任意一个实现了接口的对象,实现AOP等功能。
  4. 序列化和反序列化:许多Java序列化和反序列化工具都是基于Java反射机制实现的,例如Java的ObjectInputStream和ObjectOutputStream。

Java反射技术可以在很多场景中应用,尤其是在框架设计和组件化开发中,反射技术可以提高代码的灵活性和可扩展性,减少代码耦合性,简化代码的编写。但是,反射机制也增加了程序的复杂度,因此必须谨慎使用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值