手写Spring框架-前奏-反射获取Annotation

2023-05-16

目录

所谓反射

反射机制的作用

反射依赖reflect和Class

反射依赖的Class

Class类的特点

获取Class对象的三种方式

获取类的构造方法并使用

获取类的成员变量并使用

获取类的成员方法并使用

问题引入

解析类的注解

解析成员变量的注解标签

解析方法上的注解

注解获取属性值的底层实现


  • 所谓反射

  • 允许一个java类获得它所有的成员变量和方法,并且显示出来
  • 允许程序在运行时来进行自我检查并且对内部的成员进行操作
  • 反射主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义
  • 只要给定java类的package和名字,就可以通过反射获得类的所有信息
  • 反射机制的作用

  • 在运行时判断任意一个对象所属的类
  • 在运行时获取类的对象
  • 在运行时访问java对象的属性, 方法和构造方法等
  • 反射依赖reflect和Class

  • java.lang.reflect类库里面主要的类
    • Field :表示类中的成员变量
    • Method :表示类中的方法
    • Constructor :表示类的构造方法
    • Array :该类提供了动态创建数组和访问数组元素的静态方法
  • 反射依赖的Class

  • 用来表示运行时类型信息的对应类
  • 每个类都有唯一一个与之相对应的Class对象
  • Class类为类类型,而Class对象为类类型对象
  • Class类的特点

  • Class类也是类的一种, class则是关键字
  • Class类只有一个私有的构造函数(无法通过new来获取实例),只有JVM能够创建Class类的实例
  • JVM中只有唯一一个和类相对应的Class对象来描述其类型信息
  • 获取Class对象的三种方式

  • Object 一> getClass()
  • 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
  • 通过Class类的静态方法 : forName(String className)(常用)
  • 在运行期间,一个类,只有一个与之相对应的Class对象产生

  • 通过反射读取配置文件,可以得到该类的相关一切信息
  • Class对象就像一面镜子,透过这面镜子可以看到类的结构
  • 获取类的构造方法并使用

  • 带有Declared都是无视修饰符的
  • 通过Class对象可以获取某个类中的:构造方法
  • 获取构造方法:
  • (1)-批量的方法:
    • public Constructor[] getConstructors():所有"公有的"构造方法
    • public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
  • (2)-获取单个的方法
    • public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法
    • public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有
  • (3)-调用构造方法
    • Constructor.newInstance(Object... initargs)
  • 可以通过反射访问私有的构造方法,不过要设置权限setAccessible(true)
  • 案例-构造方法

  • 案例-调用构造方法

  • 案例-结果

  • 获取类的成员变量并使用

  • 需要注意的是:
  • 不带Declared修饰的可以获取父类的字段,带它修饰的不能获取到
  • (1)-批量的:
    • public Field[] getFields():获取所有的"公有字段"
    • public Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有
  • (2)-获取单个的
    • public Field getField(String fieldName):获取某个"公有的"字段
    • public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
  • (3)-设置字段的值
    • Field.set(Object obj,Object value)
    • public void set(Object obj,Object value)
    • 参数说明:
      • 1.obj:要设置的字段所在的对象
      • 2.value:要为字段设置的值
  • 案例-实体类

  • 案例-获得实体类属性并设置属性值

  • 案例-结果

  • 获取类的成员方法并使用

  • (1)-批量的:
  • public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
  • public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)
  • (2)-获取单个的:
    • public Method getMethod(String name,Class<?>... parameterTypes)
    • 参数说明:
      • name : 方法名
      • Class ... : 形参的Class类型对象
    • public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
  • (3)-调用方法:
    • Method.invoke(Object obj,Object... args)
    • public Object invoke(Object obj,Object... args):
    • 参数说明:
      • obj : 要调用方法的对象
      • args:调用方式时所传递的实参
  • 方法和成员变量一样都有继承父类之说,两者都一样
  • 带有Declared修饰的都是不能包含父类的
  • 同时指定使用某个成员变量或者方法时要将变量名称和方法名称传入
  • 同时需要先实例化对象再使用
  • 案例-定义方法

  • 案例-调用方法

  • 案例-结果

  • 问题引入

  • 定义注解PersonInfoAnnotation

  • 定义注解CourseInfoAnnotation

  • 使用注解

  • 怎么操作ICPC里面的注解?
  • 解析注解,通过反射获得AnnotatedElement
  • 解析类的注解

  • 运行结果:

  • 解析成员变量的注解标签

  • 1、先获得类对象
  • 2、在获得该类上得所有成员变量
  • 3、遍历成员变量数组
  • 4、判定成员变量上有没有指定得注解
  • 5、有的话就获取注解标签实例,并打印出来

  • 运行结果:

  • 解析方法上的注解

  • 运行结果:

  • CLASS:注解出现在编译好的class文件里,但是注解的相关信息不能出现在运行时
  • 一旦修改注解的生命周期不为RUNTIME,那我们就无法通过反射来获取注解信息
  • 注解获取属性值的底层实现

  • JVM会为注解生成代理对象,注解其实也是一个接口,jvm会生成中间代理对象(在程序运行时生成称为动态代理对象)
  • 通过键值对的形式为注解属性赋值
  • 编译器检查注解的使用范围,将注解信息写入元素属性表
  • 运行时JVM将RUNTIME的所有注解属性取出并最终存入map里
  • 创建AnnotationInvocationHandler实例并传入前面的map
  • JVM使用JDK动态代理为注解生成代理类,并初始化处理器
  • 调用invoke方法,通过传入方法名返回注解对应的属性值
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手写Spring框架-前奏-反射获取Annotation 的相关文章

  • Linux 线程池

    文章目录 线程池的定义使用线程池的原因基于POSIX实现的线程池基于block队列的线程池实现基于ring队列的线程池实现 设计单例模式线程池 线程池的定义 线程池就一堆已经创建好的任务线程 xff0c 初始它们都处于空闲等待状态 xff0
  • 魔都,3年,程序员到CTO

    过一个平凡无趣的人生实在太容易了 xff0c 你可以不读书 xff0c 不冒险 xff0c 不运动 xff0c 不写作 xff0c 不外出 xff0c 不折腾 但是 xff0c 人生最后悔的事情就是 xff1a 我本可以 陈素封 我可以 在
  • TCP协议

    文章目录 1 保证可靠性机制1 1 确认应答机制1 1 1确认应答机制概念1 1 2常规确认应答的工作方式1 1 3报文按序到达1 1 4 如何确认历史数据被收到1 1 5 16位序号和16确认序号 xff08 字段讲解 xff09 tcp
  • 1 对数器,二分查找,

    文章目录 对数器二分查找 1 有序序列二分查找 2 在一个有序数组中 xff0c 找 lt 61 某个数最右侧的位置 3 在一个有序数组中 xff0c 找 gt 61 某个数最左侧的位置 4 无序序列二分查找 xff0c 求局部最小值 对数
  • 2 异或位运算大厂必刷题

    文章目录 如何不用额外变量交换两个数一个数组中有一种数出现了奇数次 xff0c 其他数都出现了偶数次 xff0c 怎么找到并打印这种数怎么把一个int类型的数 xff0c 提取出最右侧的1来怎么把一个int类型的数 获取位数为1的数量一个数
  • 链表,栈,队列,递归行为,哈希表,有序表

    文章目录 链表1 单链表 双链表的反转2 删除链表中指定的值 队列1 数组循环队列的实现2 双向链表实现双端队列 栈1 用数组实现栈 栈和队列的面试题1 实现最小栈2 两个栈实现一个队列3 两个队列实现一个栈4 用栈实现图的广度优先遍历5
  • 搭建Zabbix6.0版本

    Zabbix简介 Zabbix是一个企业级的开源分布式监控解决方案 xff0c 由C语言编写而成的底层架构 xff08 server端和agent端 xff09 xff0c 由一个国外的团队持续维护更新 xff0c 软件可以自由下载使用 x
  • Linux--网络服务器配置步骤详情【1】

    目录 一 配置ip地址 二 配置yum服务器 三 配置安装nfs服务器 1 第一台机 xff1a 2 第二台机 xff1a 四 安装配置samba服务器 五 安装配置DHCP 一 配置ip地址 root 64 wenjian vi etc
  • vscode提取拓展时出错。XHR failed

    vscode提取拓展时出错 XHR failed huas weew12的博客 CSDN博客 提取扩展时出错 转载 这这人家的步骤操作 果然就好了
  • python天气语音播报

    今天的小项目是一个天气播报 xff0c 项目效果是点击运行就读出今天的天气 那么我们可以分两步走 xff0c 第一个 xff1a 先爬取到今天的天天气内容 xff0c 第二步 xff1a 电脑读出今天的天气内容 想要电脑读出内容 xff0c
  • Linux配置SSH远程登录管理

    目录 一 SSH协议 1 SSH简介 2 SSH的优点 3 SSH远程控制软件及服务 二 SSH远程管理配置 1 配置OpenSSH服务端 2 使用SSH客户端软件 xff08 1 xff09 SSH远程登录 xff08 2 xff09 s
  • Linux系统防火墙firewalld

    目录 一 firewalld概述 二 firewalld和iptables的关系 三 firewalld区域的概念 四 firewalld数据处理流程 五 firewalld检查数据包源地址的规则 六 firewalld防火墙的配置种类 1
  • ubuntu18.04忘记密码后,如何重置密码的方法

    ubuntu18 04安装在VMware虚拟上 ubuntu18 04忘记密码后 xff0c 如何重置密码 xff1f 重启系统后 xff0c 当跳出如下图所示画面时 xff0c 按住Shift键不放 xff0c 等待 2 但出现如下图所示
  • Cloudflare 小记

    url xff1a https cn airbusan com content individual 五秒盾打开后一般会出现这个页面 xff0c 然后让你点击确认你是不是真人 xff0c 点击成功后会跳往所访问的url页面 有时候不会出现这
  • 2021.11.17 指针引用数组(指针+1,指针-1以及书写格式)

    例如 xff1a int arr 10 61 1 2 3 4 5 6 7 8 9 10 int p 61 arr int q 61 amp arr 0 1 p 和 q 表示的都是一样的 xff0c 表示的都是数组首元素的地址 xff0c 只
  • 超详细的vscode 配置FTP,并本地编辑

    废话少说 xff0c 直接上步骤 xff1a 搜索sftp插件并安装 xff1b 安装成功之后 ctrl 43 shift 43 p 搜索sftp config设置内容 没有的需要自己加 xff0c 有的可以不用加 xff1b 34 nam
  • Python求1+2+3+...+100的值,计算平方根的两个代码程序

    目录 前言 一 求1 43 2 43 3 43 43 100的值 1 实现的功能 2 代码程序 3 运行截图 二 计算平方根 1 实现的功能 2 代码程序 3 运行截图 前言 1 因多重原因 xff0c 本博文由两个程序代码部分组成 xff
  • Python求1+2+3+...+100的值,计算自然数的立方和的两个程序代码

    目录 前言 一 求1 43 2 43 3 43 43 100的值 1 实现的功能 2 代码程序 3 运行截图 二 计算自然数的立方和的 1 实现的功能 2 代码程序 3 运行截图 前言 1 因多重原因 xff0c 本博文由两个程序代码部分组
  • Go基本数据类型与string类型互转

    一 基本数据类型转string类型 方法一 xff1a fmt Sprintf 34 参数 34 表达式 1 官方解释 xff1a Sprintf根据format参数生成格式化的字符串并返回该字符串 func Sprintf format
  • linux下如何设置开机自启(这里以seata服务为例)

    1 编写启动脚本 xff0c 大部分都是相同的 xff0c 但是有些程序可能略要修改 Unit Description 61 Seata Server After 61 network target Service User 61 root

随机推荐

  • MIUI12.5系统精简列表更新版200多个包,ADB卸载

    系统MIUI12 5 6 xff0c 无ROOT无面具没破解 xff0c 仅使用ADB工具箱 设备卸载后经过重启测试是否卡米 xff0c 这些都不会卡米 另外要说 xff0c 有些卸载不会卡米 xff0c 但是功能会失效 xff0c 比如
  • kali安装卡在simple-cdd不动?在右下角,有个小小的符号,找到网络适配器,然后断掉,很快就安装好了。

  • 两种方式为button元素注册点击事件,this指向

    两种方式 xff1b 第一种指向button xff0c 第二种 指向window
  • 强化学习实战——Q learning 实现倒立摆

    倒立摆参数以及数学模型 首先是写一个倒立摆的AGENT模型 pendulum env py import numpy as np import matplotlib pyplot as plt import matplotlib impor
  • dependencies.dependency

    依赖包有两个 xff0c 根据最下一行的提示找到项目的pom xml文件找到依赖
  • Vue3---语法初探

    目录 hello world 实现简易计时显示 反转字符串 显示隐藏 了解循环 了解双向绑定实现简易记事 设置鼠标悬停的文本 组件概念初探 xff0c 进行组件代码拆分 hello world 最原始形态 xff0c 找到 id 为 roo
  • MySQL实战解析底层---普通索引和唯一索引,应该怎么选择

    目录 前言 查询过程 更新过程 change buffer 的使用场景 索引选择和实践 change buffer 和 redo log 前言 在不同的业务场景下 xff0c 应该选择普通索引 xff0c 还是唯一索引 xff1f 假设你在
  • 准备离开:致消散的梦想

    学到现在基本都是悲剧以前的队友现在大多放弃了初心以前的好学长现在摆烂和失败开学时的场景再也见不到了大一开学开启OJ xff0c 那是一个永远绚丽的夜晚不管是学长还是同学 xff0c 都在那时期待未来 xff0c 欲力竭以圆其说而不是现在的颓
  • MySQL实战解析底层---MySQL为什么有时候会选错索引

    目录 前言 优化器的逻辑 索引选择异常和处理 前言 在 MySQL 中一张表其实是可以支持多个索引的但是你写 SQL 语句的时候 xff0c 并没有主动指定使用哪个索引也就是说 xff0c 使用哪个索引是由 MySQL 来确定的不知道你有没
  • 二叉搜索树

    目录 定义简介 查找结点 插入结点 删除结点 排序 二叉搜索树的效率 二叉搜索树的退化 二叉搜索树常见应用 定义简介 二叉搜索树 Binary Search Tree 满足以下条件 xff1a 1 对于根结点 xff0c 左子树中所有结点的
  • AVL 树

    目录 介绍 结点高度 结点平衡因子 AVL 树旋转 右旋 左旋 先左后右 先右后左 旋转的选择 插入结点 删除结点 查找结点 AVL 树典型应用 介绍 在进行多次插入与删除操作后 xff0c 二叉搜索树可能会退化为链表此时所有操作的时间复杂
  • 红黑树(更高级的二叉查找树)

    目录 介绍及性质 红黑树的基本定义 黑高度 时间复杂度 接近于 平衡 操作 红黑树的旋转 红黑树中插入新结点 红黑树中删除结点 红黑树与AVL树的区别 介绍及性质 红黑树 xff08 R B TREE xff0c 全称 xff1a Red
  • MySQL实战解析底层---怎么给字符串字段加索引

    目录 所谓前缀索引 前缀索引对覆盖索引的影响 其他方式 所谓前缀索引 现在 xff0c 几乎所有的系统都支持邮箱登录 xff0c 如何在邮箱这样的字段上建立合理的索引 xff0c 是今天要讨论的问题假设 xff0c 你现在维护一个支持邮箱登
  • Spring Security --- 3.5.7版本升级

    目录 WebSecurityConfigurerAdapter 被弃用 configure WebSecurity web 已经弃用 configure AuthenticationManagerBuilder auth 已经弃用 Spri
  • 双系统下,ubuntu20.04循环登录问题解决记录

    什么是循环登录 xff1a 开机登录页面 xff0c 输入密码后 xff0c 未提示密码错误 xff0c 黑屏一秒继续出现登录页面 xff0c 死循环 由于不能进桌面系统 xff0c 我们只能尝试在终端解决问题了 ctrl 43 alt 4
  • Spring Security --- 快速入门

    概念 Spring Security是一个功能强大且高度可定制的 xff0c 主要负责为Java程序提供声明式的 身份验证和访问控制 的安全框架Spring Security的底层主要是 基于 Spring AOP 和 Servlet 过滤
  • Spring Security --- 基于内存模型创建用户角色

    授权实现方式 基于内存模型实现授权基于默认数据库模型实现授权基于自定义数据库模型实现授权 基于内存模型创建用户角色 在Spring Security4 x版本中 xff0c 登陆的用户有一个默认的ROLE USER角色但是在Spring S
  • Spring Security --- authorizeRequests配置

    目录 自定义配置类之访问权限 匹配顺序规则 访问控制包含 访问控制url匹配 访问控制方法 角色 权限判断 使用注解进行角色权限控制 自定义配置类之访问权限 http authorizeRequests 主要是对url进行访问权限控制通过这
  • 手写Spring框架-前奏-注解与自定义注解

    目录 注解 介绍 功能 分类 注解处理器类库 自定义注解 常用元注解 自定义 注解 介绍 提供一种为程序元素设置元数据的方法用来将任何的信息或元数据 xff08 metadata xff09 与程序元素 xff08 类 方法 成员变量等 x
  • 手写Spring框架-前奏-反射获取Annotation

    目录 所谓反射 反射机制的作用 反射依赖reflect和Class 反射依赖的Class Class类的特点 获取Class对象的三种方式 获取类的构造方法并使用 获取类的成员变量并使用 获取类的成员方法并使用 问题引入 解析类的注解 解析