反射和注解

反射

反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。

例如idea中输入对象名,可以提示出方法和属性,就是通过反射实现的。

在这里插入图片描述

1、反射第一步:加载类,将类的字节码文件加载到内存中,然后获取类的字节码: Class对象,然后去 Class对象中获取其他信息。拿到class对象相当于拿到了类,可以进行类的一系列操作,如:获取类的名字、所在包、创建此类的对象,调用对象的方法,获取对象的属性,调用类方法等…。

2、获取类的构造器:Constructor对象,Constructor对象中封装了类中的构造方法的各种信息。

3、获取类的成员变量:Field对象

4、获取类的成员方法:Method对象

  1. 反射第一步:加载类,获取类的字节码:class对象

在这里插入图片描述

在这里插入图片描述

  • 类的字节码文件只有一份,所以通过这三种方式获取的对象是同一个。
  1. 通过类的字节码对象获取类的构造器

在这里插入图片描述

存在这样一个类:

在这里插入图片描述

获取构造方法

  • 获取全部构造器:

在这里插入图片描述

  • 获取指定构造器,根据形参类型获取:

在这里插入图片描述

  1. 使用构造器初始化对象并返回

在这里插入图片描述

存在这样一个类:

在这里插入图片描述

通过构造器创建对象

在这里插入图片描述

在这里插入图片描述

  • setAccessible()方法可以令访问控制符失效,破坏了封装性。
  1. 从字节码对象中获取成员变量

在这里插入图片描述

存在这样一个类:

在这里插入图片描述

获取成员变量:

在这里插入图片描述

对成员变量进行赋值和取值:

在这里插入图片描述

在这里插入图片描述

  1. 通过字节码对象获取类的成员方法

在这里插入图片描述

存在这样一个Cat类,类中的方法如下:

在这里插入图片描述

获取方法

在这里插入图片描述

在这里插入图片描述

执行方法

在这里插入图片描述

在这里插入图片描述

反射的作用和应用场景

反射的作用

在这里插入图片描述

注解

注解就是java代码里的特殊标记,比如:@Override、@Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序。

注意: 注解可以用在类上、构造器上、方 法上、成员变量上、参数上、等位置处。

自定义注解

在这里插入图片描述

说明:

  • 属性类型:可以是任意的java类型,包括枚举类型

  • 属性名后面一定要加()

  • public(可省略):注解属性的修饰符一定是public,所以可以省略public

  • default(可省略):default后面接默认值,可不写默认值。

  • 特殊属性value:

    • 如果注解中只有一个value属性,使用注解时,value名称可以不写!!

    • 如果注解中既有value属性,又有其他属性,且其他属性有默认值。使用注解时,如果其他属性使用默认值,则value名称也可以不写。

实例1:

在这里插入图片描述

实例2:

在这里插入图片描述

使用注解

实例1:

在这里插入图片描述

说明:

  • 在使用注解时一定要给没有默认值的属性赋值
  • 若属性的类型为数组,为该属性赋值时,使用{}来表示数组。

实例2:

在这里插入图片描述

说明:

  • 因为@MyTest2的属性只有一个value,所以使用@MyTest2时,属性名value可以省略

注解的原理

对MyTest1注解生成的MyTest1.class进行反编译,可以得到如下

在这里插入图片描述

  • 注解本质是一个接口,Java中所有注解都是继承了Annotation接口的。
  • @注解(…):其实就是一个实现类对象,实现了该注解以及Annotation接口。

元注解

元注解指的是修饰注解的注解

@Target

用法:

在这里插入图片描述

实例1:

MyTest3注解只能用在类、接口和成员方法上

在这里插入图片描述

@Retention

用法:

在这里插入图片描述

实例1:

在这里插入图片描述

注解的解析

什么是注解的解析?

  • 就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来。

如何解析注解?

  • 指导思想:要解析谁上面的注解,就应该先拿到谁。

  • 比如要解析类上面的注解,则应该先获取该类的Class对象,再通过class对象解析其上面的注解。

  • 比如要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解。

  • Class、Method、Field、 Constructor都实现了AnnotatedElement接口,它们都拥有解析注解的能力。

在这里插入图片描述

解析注解的案例

需求:

在这里插入图片描述

  1. 自定义注解

在这里插入图片描述

  1. 使用注解

在这里插入图片描述

  1. 解析类上的注解

在这里插入图片描述

  1. 解析方法上的注解

在这里插入图片描述

注解的应用场景

需求与分析:

在这里插入图片描述

  1. 自定义注解

在这里插入图片描述

  1. 定义若干方法

在这里插入图片描述

  1. 模拟junit程序

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值