java的前生今世_java注解的前生今世

2023-11-10 05:10
文章标签 java 注解 今世 前生

本文主要是介绍java的前生今世_java注解的前生今世,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自定义一个注解,该注解名字为“MyExecute”,在运行时有效,作用范围在方法上;其中有两个成员变量:value与ignore。代码如下:

/**

* 指定该注解的生命周期

* 1、仅编译期:RetentionPolicy.SOURCE;

* 2、仅class文件:RetentionPolicy.CLASS;

* 3、运行期:RetentionPolicy.RUNTIME。

* 只有在运行期才可以通过反射获取到

*/

@Retention(RetentionPolicy.RUNTIME)

/**

* 指定该注解能够用于哪些程序元素

* 1、类或接口:ElementType.TYPE;

* 2、字段:ElementType.FIELD;

* 3、方法:ElementType.METHOD;

* 4、构造方法:ElementType.CONSTRUCTOR;

* 5、方法参数:ElementType.PARAMETER。

*/

@Target({ElementType.METHOD})

//创建注解使用 @interface 关键字来声明

public @interface MyExecute {

/**

* 1、成员变量无参数方法的形式来声明:方法名是该成员的名字、返回值是该成员的类型

* 2、可以指定初始值,初始值用 default 关键字

* 3、如果只要一个参数成员,建议使用参数名为value()

* @return

*/

String value() default "MyAnnotation";

/**

* 定义成员变量ignore() 类型为boolean 只有方法上该成员变量值为true时,该注解才起作用,

* 需要反射来配合该注解。

*/

boolean ignore() default false;

}

自定义一个类,类中有两个方法,在这两个方法上使用该注解:

public class AnnotationTest {

@MyExecute(value = "自定义的注解MyExecute,并且ignore为true!", ignore = true)

public void ignoreTrue(){

System.out.println("ignore为真,不调用,用来测试自定义注解!");

}

//不指定ignore的值,默认为false,会执行。

@MyExecute(value = "自定义的注解MyExecute,并且ignore为默认值false!")

public void ignoreFalse(){

System.out.println("ignore为假,不忽视,调用方法,用来测试自定义注解!");

}

}

测试自定义注解,自定义注解要有实际意义,需要配上注解的信息处理流程,也就是使用反射获取到注解并进行处理。

public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {

//使用反射来使自定义注解有实际意义

AnnotationTest annotationTest = new AnnotationTest();

//1、获取当前类的Class实例 使用运行时类的.class属性来获取

//也可以使用annotationTest.getClass()方法来获取

Class clazz = AnnotationTest.class;

//2、获取所有的方法,并拿到方法上的注解

Method[] methods1 =clazz.getDeclaredMethods();

for (Method method : methods1) {

//判断这个方法是否存在自定义的注解

if(method.isAnnotationPresent(MyExecute.class)){

//拿到该注解下的成员ignore,并判断是否为false

MyExecute myExecute = method.getAnnotation(MyExecute.class);

System.out.println("***************************************");

System.out.println("该方法名为:"+method.getName()+",它上面注解的value成员值为:"+myExecute.value());

if(!myExecute.ignore()){

System.out.println("当ignore为false时执行该方法!!!");

method.invoke(annotationTest,null);

}

}

}

}

运行结果

bc66959ff4abf66def8318a2a1bea9e9.png

注意

注解的成员如果没有默认值时,使用注解时,需要指定该成员的值,除非该成员有默认值;指定格式为:“参数名 = 参数值”;当只有一个成员且名称为value(),指定参数值时可以取消“value = ”;

自定义注解要想使其有意义,需要与注解的信息处理流程(反射)相配合。

这篇关于java的前生今世_java注解的前生今世的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/380540

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏