Java通过反射运用自定义注解案例

2023-11-07

Java和大数据系列

注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天和大家分享一下Java通过反射自定义注解案例
#博学谷IT学习技术支持#



前言

Java中反射和自定义注解都是Java中非常重要的技术栈,对新手来说非常抽象,不好理解,今天主要是把这两个技术栈串起来,写个小案例,方便大家理解


一、注解是什么?

注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。

二、元注解是什么?

元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:
@Target,
@Retention,
@Documented,
@Inherited

下面我们看一下每个元注解的作用和相应分参数的使用说明。
@Target
表明该注解可以应用的java元素类型:
在这里插入图片描述
@Retention
表明该注解的生命周期
在这里插入图片描述
@Document
表明该注解标记的元素可以被Javadoc 或类似的工具文档化。

@Inherited
表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解。

三、自定义注解

修饰符: 访问修饰符必须为public,不写默认为pubic;
关键字: 关键字为@interface;
注解名称: 注解名称为自定义注解的名称,使用时还会用到;
注解内容: 注解中内容,对注解的描述。

1.定义自定义注解

代码如下(示例):

package pack07;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface Book {
    String value();
    double price() default 100;
    String[] authors() default {"xxx"};
}

这里自定义一个Book注解,可以应用在类和方法上,生命周期定义为RUNTIME,定义3个注解变量,其中2个是有default。

2.使用自定义注解

代码如下(示例):

package pack07;

class Demo{
    @Book(value = "xxx")
    public void show1(){
        System.out.println("我是show1方法!");
    }

    @Book(value = "yyy")
    public void show2(){
        System.out.println("我是show2方法!");
    }

    public void show3(){
        System.out.println("我是show3方法!");
    }
}

写一个非常简单的Demo类,定义3个方法show1,show2,show3,其中show1和show2使用注解,但是给定的注解变量value值不同,而show3方法没有使用注解

3.通过反射测试自定义注解

代码如下(示例):

package pack07;

import java.lang.reflect.Method;

public class TestDemo {
    public static void main(String[] args) throws Exception {

        //获取类的class对象
        Class<?> clazz = Class.forName("pack07.Demo");
        Object object =clazz.newInstance();

        //获取类中所有的方法
        Method[] methods = clazz.getDeclaredMethods();

        //遍历所有方法
        for (Method method : methods) {
            boolean bl = method.isAnnotationPresent(Book.class);
            if (bl){
                System.out.println(method.getName()+"方法加了book注解");
                System.out.println("-----------------------------");

                //判断注解的value是否是yyy
                Book bookAnno = method.getAnnotation(Book.class);
                String value = bookAnno.value();
                if ("yyy".equals(value)){
                    System.out.println(method.getName()+"方法加了book注解,且value值为yyy");
                    method.invoke(object);
                    System.out.println("-----------------------------");
                }
            }
            else {
                System.out.println(method.getName()+"方法没加book注解");
            }
        }
    }
}

1.通过反射得到Demo类中所有的方法
2.对所有方法进行遍历操作
3.判断该方法是否添加book注解
4.判断该方法是否添加value变量为yyy的注解
5.最终通过method.invoke(object)调用该方法
在这里插入图片描述


总结

本文通过一个简单案例,将反射和自定义注解串起来,帮助大家更好的理解反射和自定义注解,两个相对抽象的java技术栈,希望对大家有所帮助。

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

Java通过反射运用自定义注解案例 的相关文章

  • 在Java中将*s打印为三角形?

    我在 Java 课程中的作业是制作 3 个三角形 一份左对齐 一份右对齐 一份居中 我必须为什么类型的三角形制作一个菜单 然后输入需要多少行 三角形必须看起来像这样 到目前为止 我能够完成左对齐的三角形 但我似乎无法获得其他两个 我尝试用谷
  • 如何从 Play WSClient 的字符串创建 WSResponse 对象

    文档 https www playframework com documentation 2 4 x JavaTestingWebServiceClients Mock the web service建议使用模拟Web服务测试基于WSCli
  • 单元测试组合服务方法

    我正在为一个类编写 junit 单元测试 该类使用以下方法实现公开的接口 public Set
  • Quarkus 不以编程方式选择 bean

    我试图以编程方式选择 bean 但 quarkus 不会注入 bean 并引发异常 不支持吗 public enum ReportType ONE TWO Qualifier Retention RUNTIME Target METHOD
  • GET 请求的 Spring 注解

    这两种spring GET方法有什么区别呢 哪一种是首选方法 Component Scope request Path public class TestComponent GET Path hello public String prin
  • 如何在Java中优雅地处理SIGKILL信号

    当程序收到终止信号时如何处理清理 例如 我连接到一个应用程序 希望任何第三方应用程序 我的应用程序 发送finish注销时的命令 发送该信息最好说什么finish当我的应用程序被破坏时的命令kill 9 编辑1 kill 9无法被捕获 谢谢
  • 具有 CRUD 功能的基于 Spring Web 的管理工具

    在 PHP Symfony 世界里有一个工具叫 Sonata Adminhttps sonata project org https sonata project org 基于 AdminLTE 模板 这是一款一体化管理工具 具有登录 菜单
  • 使用 JAX-WS 的 WebLogic 中没有模式导入的单个 WSDL

    如何使用 JAX WS 配置由 WebLogic 10 3 6 生成的 Web 服务 以将对象架构包含在单个 WSDL 文件声明 而不是导入声明 中 示例代码 界面 import javax ejb Local Local public i
  • 从 HttpClient 3 转换为 4

    我已经成功地对所有内容进行了更改 但以下内容除外 HttpClient client HttpPost method client new DefaultHttpClient method new HttpPost url InputStr
  • 查找数组中的组合

    我在java中有一个像这样的二维数组 transmission communication tv television approach memorycode methodact 我需要获得所有组合 例如 transmission appr
  • 如何使用 swagger-codegen-plugin (maven) 生成客户端代码?

    我需要使用 swagger codegen plugin for maven 在 eclipse 中生成服务器存根代码 你能帮忙怎么做吗 以及需要什么配置 在 pom xml 中 我找到了这个答案 您只需要像下面这样更改 pom xml 即
  • 改变 Java 中凯撒移位的方向

    用户可以通过选择 1 向左或 2 向右移动字母来选择向左或向右移动 左边工作正常 右边不行 现在它显示了完全相同的循环 但我已经改变了所有 and 以不同的方式进行标记 最终我总是得到奇怪的字符 如何让程序将字符向相反方向移动 如果用户输入
  • 使用 HTTPServletRequestWrapper 包装请求参数

    我有一个可以验证 授权 REST 调用的过滤器 该过滤器需要访问请求参数 因此我为此编写了一个自定义 HTTPServletRequestWrapper import java util Collections import java ut
  • 配置jmxremote时无法正常停止tomcat

    我添加了一个jmxremotecatalina bat中的配置 set JAVA OPTS Dcom sun management jmxremote port 9004 Dcom sun management jmxremote ssl
  • Jetty Plugin 9启动不喜欢icu4j-2.6.1.jar

    我对 mortbay 的 Maven jetty 插件 6 有相同的配置
  • java swing:向 JTree 项目添加自定义图形按钮

    我想在 JTree 中的项目右侧添加一个带有小图标的附加按钮 这可以做到吗 如果是这样 怎么办 thanks Clamp 你在这方面成功了吗 我想做同样的事情 但很难让 JButton 响应用户 设置渲染器以显示按钮的过程很顺利 但所有鼠标
  • Java8:流映射同一流中的两个属性

    我有课Model带有以下签名 class Model private String stringA private String stringB public Model String stringA String stringB this
  • CXF:通过 SOAP 发送对象时如何排除某些属性?

    我使用 Apache CXF 2 4 2 当我将数据库中的某个对象返回给用户时 我想排除一些属性 例如密码 我怎样才能做到这一点无需创建临时的班级 有这方面的注释吗 根据 tomasz nurkiewicz 评论我应该使用 XmlTrans
  • 为什么我不能将 Collection 转换为 Collection>

    问题的关键是 为什么这会导致编译时错误 List
  • Android Google 地图无法在当前主题中找到样式“mapViewStyle”

    添加谷歌地图视图时 我扩展了MapView 使用xml编辑器将其添加到活动中 并将我的谷歌地图api密钥手动添加到布局xml文件中 我的权限在清单文件中允许互联网 我想知道的是 在 xml 编辑器中 我收到错误 无法在当前主题中找到样式 m

随机推荐

  • 初识OpenGL (-)纹理过滤(Texture Filtering)

    1 OpenGL需要知道怎样将纹理像素 Texture Pixel 也叫Texel 映射到纹理坐标 纹理坐标 不依赖于分辨率 Resolution 它可以是任意浮点值 给模型顶点设置的那个数组 OpenGL以这个顶点的纹理坐标数据去查找纹理
  • 基于gradle创建springBoot web项目(idea版本)

    1 创建纯净基于gradle的项目 idea版本 我们不基于https start spring io 来创建项目 因为其中有很多配置是我们不需要的 第一步 FIle gt New gt Project 选择Gradle Home 地址 F
  • 高德地图api之兴趣点搜索

    除了定位basic map 我们现在探讨一下使用api中提供的搜索兴趣点服务和路线查找服务 高德地图的api提供了对千万级别的兴趣点的搜索 PoiSearch有几种方式 常用的有关键字搜索 类型搜索 关键字搜索 1定义PoiSearch类
  • 什么是实体关系图(ERD)?

    什么是实体关系图 ERD 转载自 https www visual paradigm com cn guide data modeling what is entity relationship diagram 数据库是软件系统中不可或缺的
  • 基于DTW动态时间规整算法的时间序列特征分类matlab仿真

    目录 1 算法仿真效果 2 MATLAB源码 3 算法概述 4 部分参考文献 1 算法仿真效果 matlab2022a仿真结果如下 lt
  • Python GUI 设计(二)—Widget组件详解

    本篇是关于Tkinter模块中的组件及其用法的介绍 涉及Label Button Entry组件 1 1 Label标签组件 Label组件是窗口中比较常用的组件 通常用来添加文字和图片 同时还可以定义文字和图片的排列方式 它的语法格式如下
  • TCP/IP网络编程(1)

    1 套接字 套接字是由操作系统提供的网络数据通信软件设备 即使对网络数据传输原理不了解 也能够使用套接字完成网络数据传输 为了与远程计算机进行数据传输 需要连接到英特网 套接字就是进行网络连接的工具 服务端 接收连接请求的套接字创建流程如下
  • Unity 报错 UnauthorizedAccessException: Access to the path“”is denied.

    根据能查到的各种解释综合分析 导致该报错出现的原因有以下几点 1 第一次文件写入操作未结束就进行了第二次操作 2 路径中的文件没有写入权限 3 当前用户无访问权限
  • 了解 GNU GPL/GNU LGPL/BSD/MIT/Apache协议

    文章来源 http iflonely com wordpress 2010 07 E4 BA 86 E8 A7 A3 gnu gplgnu lgplbsdmitapache E5 8D 8F E8 AE AE 越来越多的开发者与设计者希望将
  • ORM框架 Dapper

    一 介绍 Dapper是一款轻量级ORM工具 如果你在小的项目中 使用Entity Framework NHibernate 来处理大数据访问及关系映射 未免有点杀鸡用牛刀 你又觉得ORM省时省力 这时Dapper 将是你不二的选择 ORM
  • 黑盒测试中的决策表设计

    前言 在软件开发中 测试是不可或缺的一个环节 其中 黑盒测试是一种比较常用的测试方法 它强调测试人员不需要知道程序内部结构 只需根据程序规格说明书来设计测试用例进行测试 本文将介绍黑盒测试中的一种决策表设计方法 同时 我也为大家准备了一份软
  • 前端WebSocket详解

    websocket是H5才开始提供的一种在单个TCP连接上进行全双工通讯的协议 主要作用就是建立服务器和客户端的长连接能更好的节省服务器资源和带宽 服务器向浏览器推流实现实时通信 复制代码 和http一样 WebSocket也是应用层协议
  • mysql create trigger 触发器已存在

    1 CREATE TRIGGER 时显示触发器以存在 2 DROP TRIGGER IF EXISTS 也失败 解决 1 通过my ini 查到 datadir的路径 找到数据文件路径 2 找到相关数据库目录 删除相关触发器文件 如触发器名
  • eclipse_cpp 配置mingw

    1 MinGW 5 1 6的安装 首先下载 然后双击安装 过程如下 这一步如果你只想用Eclipse编译C C程序的话 只选上面三项即可 当然你可以都安装上 接下来就等着慢慢下载和安装吧 如果你的网速比较快的话 那么你是非常幸运的 2 配置
  • 宽度优先搜索(BFS)详解,以及双向广搜

    百度百科的官方解释 宽度优先搜索算法 又称广度优先搜索 是最简便的图的搜索算法之一 这一算法也是很多重要的图的算法的原型 Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想 其别名又叫BFS 属于一种盲
  • td 字典表_mysql常用字典表(完整版)

    本节内容 mysql数据库中的常用字典表 1 显示数据库列表 复制代码 代码示例 mysql gt show databases 说明 其中字典库是 information schema 其中常用字典表 INFORMATION SCHEMA
  • java 面向对象编程 --- 类及类的成员

    目录 学习面向对象内容的三条主线 面向过程与面向对象 面向过程 POP 与 面向对象 OOP 面向对象的三大特征 例子 人把大象装进冰箱 面向对象的思想概述 类和对象 面向对象的思想概述 Java类及类的成员 类的语法格式 创建Java自定
  • SqlServer千万级以上的数据表查询优化方案《冷热数据库分离》的思路

    1 是分库而不是分表 分表即需要考虑引入分表算法 又影响后续查询 2 热数据只占全部数据的一部分 因此每次优先查询热库 以下情况才查询冷库 a 当查询条件未命中 结果集为空 时 查询冷库 b 当查询条件部分命中时 查询冷库 3 为了区分部分
  • Android解决问题的思路

    1 前言 授人以鱼不如授人以渔 当向别人请教了问题且被解答了疑惑后 或许也想知道对方是如何思考 如何按照一定的的逻辑得出最终的答案 故想分享一下我这6年Android开发中是如何解决问题的 一家之言 请同学们多多指教 2 指导性原则 第一点
  • Java通过反射运用自定义注解案例

    Java和大数据系列 注 大家觉得博客好的话 别忘了点赞收藏呀 本人每周都会更新关于人工智能和大数据相关的内容 内容多为原创 Python Java Scala SQL 代码 CV NLP 推荐系统等 Spark Flink Kafka H