反射与注解

2023-11-08

反射与注解

一、反射
  1. 使用反射机制可以动态的获取当前class的信息,比如方法的信息、注解信息、方法的参数、属性
  2. 反射目的:方便开发者对框架的拓展,缺点:消耗一定资源、破坏封装性
二、字节码对象创建方式
	Class class1 = 类名.class 
    Class class2 = Class.forName(包路径) //使用最多 
    Class class3 = 对象.getClass() 
    // class1 == class2 == class3  
三、反射常用api
1. getDeclaredMethod(s):返回自身类的所有公用(public)方法包括私有(private)方法,
   这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,
   但不包括继承的方法。
2. 返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法,
   这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承
    的那些的类或接口)的公共 member 方法。
// getDeclaredMethods的关键词是:自身,所有方法,不继承 
// getMethods的关键词是public+继承 
3. getDeclaredField(s)和getField(s)同上。
4. getDeclaredAnnotation(s):返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,
    该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)
    该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。
5. getAnnotation(s):返回此元素上存在的所有注释。(如果此元素没有注释,则返回长度为零的数组。)
    该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。
// getDeclaredAnnotations得到的是当前成员所有的注释,不包括继承的。
// getAnnotations得到的是包括继承的所有注释。 
四、反射越过泛型检查
// 反射越过泛型检查 
ArrayList<String> arrayList = new ArrayList<>(); 
arrayList.add("1"); 
Class<? extends ArrayList> aClass = arrayList.getClass(); 
Method add = aClass.getMethod("add", Object.class); 
add.invoke(arrayList, 23); System.out.println(arrayList);  // [1, 23],数据已经插入进去 
// java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String     
arrayList.forEach(System.out::println); // 注意,如果使用循环遍历时容易导致类型转换异常 
五、注解
  1. 元注解用来在声明新注解时指定新注解的一些特性
  2. 开发人员自定义注解

常用注解

@Target(ElementType.METHOD) //指定注解在方法上

@Retention(RetentionPolicy.RUNTIME) //指定新注解保留到程序运行时期

@Inherited // 指定新注解标注在父类上时可以被子类继承

六、获取方法、字段上面的注解
Class<?> aClass = Class.forName("com.lzs.annotationdemo.day01.User");
Method sum = aClass.getMethod("test"); 
Field userName = aClass.getDeclaredField("userName"); 
// 反射获取方法上的注解
LzsName method = sum.getDeclaredAnnotation(LzsName.class);
// 反射获取字段上的注解 
LzsName filed = userName.getDeclaredAnnotation(LzsName.class);
// 如果没有方法上没有 @LzsName该注解则为null
System.out.println(method); //@com.lzs.annotationdemo.annotation.LzsName()
// 如果没有字段上没有 @LzsName该注解则为null 
System.out.println(filed); //@com.lzs.annotationdemo.annotation.LzsName() 
七、使用aop环绕通知拦截目标方法(aop+自定义注解实现限流)

封装限流注解思路

  1. 需要自定义注解
  2. 限流注解如何生效
  3. 如何判断方法上是否加上了限流注解

解决思路

  1. 使用反射机制判断该方法上是否加上限流注解
  2. 如果该方法上有加注解,则调用限流api框架
八、为什么要使用环绕通知(aop)
  1. 环绕通知非常的灵活控制目标方法是否执行
  2. 环绕通知
  3. 前置通知-----如何触发:

如果在环绕通知中调用了目标方法,则会先执行前置通知,再执行目标方法

  1. 目标方法
  2. 后置通知
  3. 异常通知

环绕通知中执行目标方法时执行顺序: 环绕通知开始执行 前置通知 目标方法开始执行 环绕通知结束执行 后置通知 环绕通知中不执行目标方法时执行顺序:(前置通知不执行) 环绕通知开始执行 环绕通知结束执行 后置通知

九、总结
  1. 熟悉反射3种获取字节码对象的方法

    Class class2 = Class.forName(包路径) //使用最多 
    
  2. 会自定义注解,如果不知道如何定义注解,可以随便找一个注解点进去看看

  3. 熟悉反射常用api,如获取构造器、方法、属性等(获取方法运用最多,通过反射调用方法)

  4. 熟悉aop+反射+自定义注解这一套

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反射与注解 的相关文章

随机推荐

  • seaborn库学习笔记

    导入seaborn库 因此一般直接导入相关库 import numpy as np import seaborn as sns import matplotlib pyplot as plt import pandas as np 整体布局
  • 密码学原语如何应用?解析密码学特有的数据编解码|第10论

    隐私保护方案的工程实现 如何关联到学术论文中天书一般的公式符号 密码学工程中 有哪些特有的数据编解码方式 存在哪些认知误区和注意事项 需要克服哪些限制和挑战 作为支撑隐私保护方案的核心技术 如何运用数据编解码 将密码学论文中抽象的数学符号和
  • 30 秒使用 Sealos 搭建个人密码管理器 Vaultwarden

    我与 LastPass 的曲折恋情 超过 8 年网龄的我 注册过很多网站帐号 每个网站的密码我都用不同的复杂密码 一开始我全靠脑力记忆这些密码 后来渐渐觉得记起来很困难 就记录在笔记本上 但是随着时间推移 我发现这种方法既不安全也不可靠 有
  • VS2010彻底卸载

    依照微软网站http msdn microsoft com zh tw library e2h7fzkw aspx 完整移除方法有两种 方法一 工具卸载 下载Microsoft Visual Studio 2010 Uninstall Ut
  • 机器学习(基于python数学基础)——概率统计篇(一)全概率与贝叶斯公式

    注 学习本篇前最好一定的数学基础 即学习过概率论与数理统计 这个问题是求全概率的 在这里我们给它加上一问求 取得正品且是甲厂生产的概率 import numpy as np H np array 1 2 3 10 2 10 完备事件组概率
  • 增强学习/强化学习 综述

    创建于 20210512 修改于 20210512 文章目录 1 增强学习概念 2 1 增强学习定义 2 2 两大特点 2 简书 阿阿阿阿毛 https www jianshu com u a18653721b40 3 知乎 叶强 http
  • Java程序员不得不会的面试题(含答案)

    每个技术人都有个大厂梦 我觉得这很正常 并不是饭后的谈资而是每个技术人的追求 像阿里 腾讯 美团 字节跳动 京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司 小公司 如果说能够在这样的公司锻炼几年 相信对自己能力的提升还是非常大的
  • 计算机文件路径的表示

    文件路径作为计算机基础内容 在很多时候都扮演着十分重要的角色 例如控制台命令 资源文件的存放等等 以下将介绍计算机文件路径的表示方法以及一些常见的使用场景 文件路径的表示分为两种方式 绝对路径表示法和相对路径表示法 绝对路径与相对路径的区别
  • node koa发送邮箱验证码

    1 注册一个邮箱 开启POP3 SMTP IMAP 下方代码内的auth pass 下图授权码 2 nodejs koa发送邮箱验证码 const nodemailer require nodemailer const userEmail
  • 【第六章】STM32单片机+NB-IoT模组BC95采集温湿度数据发到电信平台(下)

    相关信息 设备接入方式 CoAP非加密方式 应用开发 串口助手AT命令对接平台 这部分内容是通过电脑串口调试软件 手动发AT指令 直接发给NB IoT模块 NB模块返回的信息 直接到电脑串口调试软件 一步一步动手操作 实现连接OceanCo
  • volatile关键字概览

    1 多线程下变量的不可见性 1 1 概述 在多线程并发执行下 多个线程修改共享的成员变量 会出现一个线程修改了共享变量的值后 另一个线程不能直接看到该线程修改后的变量的最新值 package Ls import java util Hash
  • python book.save_Writer.save文件()使用新名称python

    尝试用其他名称保存excel文件时出错 这是我代码的一部分 precios read pd read excel Precios xls format auth2 sheet name Precios precios read precio
  • 如何使用树莓派连接电脑无线网络热点并查看树莓派ip地址

    1 确保电脑已经联网 在电脑右下角点开 网络连接 打开 无线热点 右键转到 设置 2 查看 热点名称和密码 并确保网络频率为2 4GHz 树莓派现时只支持802 11 n的WIFI标准所以只能连接2 4G网络 所以你需要确保你所连接的是2
  • RSA密钥长度、明文长度和密文长度

    RSA密钥长度 明文长度和密文长度 本文整理RSA加解密中必须考虑到的密钥长度 明文长度和密文长度问题知识 对第一次接触RSA的开发人员来说 RSA算是比较复杂的算法 以后还会补充几篇RSA基础知识专题文章 用最简单最通俗的语言描述RSA
  • tomcat与myeclipse的安装与建立连接

    tomcat与myeclipse的安装与建立连接 1 首先需要下载Tomcat与Myeclipse 官网下载 Tomcat http tomcat apache org Myeclipse http www myeclipseide com
  • docker 容器内报错 Failed to establish a new connection: [Errno -3] Temporary failure in name ....

    docker 直接镜像 save 然后 load 当 load 到不同主机后 由于镜像的配置文件完整保存 默认的 bridge 网络会继承原主机的配置项 这样会导致在另一个主机上可能会出现网络请求无法发出的问题 这时可以通过直接将 brid
  • Centos系统上nginx安装

    目录 一 安装nginx依赖 pcre 二 安装 openssl zlib gcc 依赖 三 安装nginx 四 启动nginx 五 访问nginx 前置 创建nginx目录后 进入nginx目录下操作 root ecs b612 mkdi
  • java根据模板导出PDF详细教程(无bug版)

    题记 由于业务的需要 需要根据模板定制pdf文档 经测试根据模板导出word成功了 但是导出pdf相对麻烦了一点 两天的研究测试java导出PDF 终于成功了 期间走了不少弯路 今分享出来 欢迎大家有问题在此交流 与君共勉 一 需求 根据业
  • wx.getUserInfo() API的使用方案流程汇总

    注 wx getUserInfo API 官网介绍是获取用户信息功能 但是在小程序中调用时弹出的框展示的是授权登录弹框 所以下文中说的 授权登录 和 获取用户信息 都是指这个功能 所遇问题 本文主要聊一聊wx getUserInfo API
  • 反射与注解

    反射与注解 一 反射 使用反射机制可以动态的获取当前class的信息 比如方法的信息 注解信息 方法的参数 属性 反射目的 方便开发者对框架的拓展 缺点 消耗一定资源 破坏封装性 二 字节码对象创建方式 Class class1 类名 cl