java 自定义注解
一、注解(Annotation)的简介:
注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。
二、注解的分类:
1、一般常用的注解可以分为三类:
一类是Java自带的标准注解,包括@Override(标明重写某个方法)、@Deprecated(标明某个类或方法过时)和@SuppressWarnings(标明要忽略的警告),使用这些注解后编译器就会进行检查。
一类为元注解,元注解是用于定义注解的注解,包括@Retention(标明注解被保留的阶段)、@Target(标明注解使用的范围)、@Inherited(标明注解可继承)、@Documented(标明是否生成javadoc文档)
一类为自定义注解,可以根据自己的需求定义注解
2、注解基本元素解析(@RequiresPermissions 注解为例)
声明一个注解要用到的:
● 修饰符
访问修饰符必须为public,不写默认为pubic;
● 关键字
关键字为@interface;
● 注解名称
注解名称为自定义注解的名称,使用时还会用到;
● 注解类型元素
注解类型元素是注解中内容,可以理解成自定义接口的实现部分;
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface RequiresPermissions { String[] value(); Logical logical() default Logical.AND; }
@Target
表明该注解可以应用的java元素类型
Target类型 |
描述 |
ElementType.TYPE |
应用于类、接口(包括注解类型)、枚举、或enum声明 |
ElementType.FIELD |
应用于类中的成员变量(包括枚举中的常量) |
ElementType.METHOD |
应用于方法 |
ElementType.PARAMETER |
应用于方法的形参 |
ElementType.CONSTRUCTOR |
应用于构造函数 |
ElementType.LOCAL_VARIABLE |
应用于局部变量 |
ElementType.ANNOTATION_TYPE |
应用于注解类型 |
ElementType.PACKAGE |
应用于包 |
ElementType.TYPE_PARAMETER |
JDK1.8版本新增,应用于类型变量) |
ElementType.TYPE_USE |
JDK1.8版本新增,应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型) |
@Retention
表明该注解的生命周期
生命周期类型 |
描述 |
RetentionPolicy.SOURCE |
编译时被丢弃,不包含在类文件中(即源文件保留 ) |
RetentionPolicy.CLASS |
JVM加载时被丢弃,包含在类文件中,默认值(即class保留 ) |
RetentionPolicy.RUNTIME |
由JVM 加载,包含在类文件中,在运行时可以被获取到(即运行时保留 ) |
@Document
表明该注解标记的元素可以被Javadoc 或类似的工具文档化
@Inherited
表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解
三、自定义注解格式:
public @interface 注解名 {定义体}
注解参数的可支持数据类型:
1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
2.String类型
3.Class类型
4.enum类型
5.Annotation类型
6.以上所有类型的数组
Annotation类型里面的参数该怎么设定:
第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;
第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;
第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。
3.1 自定义注解:@FileName
import java.lang.annotation.*; @Target({ElementType.FIELD, ElementType.PARAMETER})//成员变量 @Retention(RetentionPolicy.RUNTIME)//运行时 @Documented public @interface FileName { String value() default ""; String description(); }
测试类:
@RunWith(SpringRunner.class) @SpringBootTest @Slf4j public class FileNameTest { @FieldName(value = "张三", description = "用户姓名") private String userName; @Test public void contextLoads() { log.info("hello test"); } @Test public void testAnotation() { log.info("start ..."); //获取测试类的模版 Class nameClass = FileNameTest.class; //获取 所有的字段 for (Field f : nameClass.getDeclaredFields()) { //判断此字段是否有FileName注解 if (f.isAnnotationPresent(FieldName.class)) { FieldName fAnnotation = f.getAnnotation(FieldName.class); log.info("字段:[" + f.getName() + "], 值:[" + fAnnotation.value() + "], 描述:[" + fAnnotation.description() + "]"); } } } }
文章来源: 微信公众 -> IT专刊 -> Java自定义注解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律