网站首页 > 技术文章 正文
在Java中,注解和class、interface一样,也是一种类型。Java 注解是从 Java5 开始添加到 Java 语言的。SpringBoot框架就广泛地应用了注解,而取代了XML配置文件。对于Java开发人员来说,Java注解也是非常常用的Java语法特性之一。
Java语言有多少个注解呢?
Java最开始的内置注解有7个,其中3个是用来修饰代码的。
- @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
- @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
- @SuppressWarnings - 指示编译器去忽略注解中声明的警告。
另外还有4个注解是作用在自定义注解上的,是注解的注解,因此也被称为“元注解”。
- @Retention - 标识这个注解存在的阶段,比如只是存在于代码中(编译器),还是会编入字节码文件中(类加载),或者是在运行时可以通过反射访问(运行时)。
- @Documented - 能够将注解中的元素包含在用户文档中。
- @Target - 标记注解应该作用在什么元素上,比如Java类,类方法,或者类属性等。
- @Inherited - 标记这个注解是继承于哪个注解类。一个被@Inherited作用的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。
从 Java 7 开始,又陆续添加了一些新的注解:
- @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
- @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
- @Repeatable - Java 8 开始支持的元注解,标识某注解可以在同一个声明上使用多次,而且每次使用注解可以代表不同的含义。
- @Native - Java 8 开始支持的元注解,使用 @Native 注解修饰成员变量,则表示这个变量可以被本地代码引用。
注解的本质
从上面的图中可以看出,上面提到的所有注解都是接口 Annotation的实现。
package java.lang.annotation;
public interface Annotation {
boolean equals(Object obj);
int hashCode();
String toString();
Class<? extends Annotation> annotationType();
}
每1个注解都和 1 个 RetentionPolicy 关联。RetentionPolicy 是 Enum 枚举类型,它用来指定 Annotation 的保留策略;每1个注解还和1个或多个 ElementType 关联,ElementType 也是个枚举类型,它用来指定 Annotation 的类型。
如何自定义注解
Java自定义注解用的修饰符是 @interface。
以下代码就定义了一个注解 MyAnnotation。
public @interface MyAnnotation {
//blabla
}
接着我们就可以在类或者方法上使用刚刚定义好的注解。
@MyAnnotation
public class test {
@MyAnnotation
public static void main(String[] args){
//blabla
}
}
但是刚刚定义的注解是没有任何意义的,要使我们自己的注解工作,就要用到元注解,需要用元注解来修饰我们的注解。前面介绍的元注解最常用的就是:@Retention、 @Target、 @Document、 @Inherited和@Repeatable(JDK1.8加入)。
Retention的英文含义就是保留、保持的意思,使用@Retention 就是来决定注解会存在到哪个阶段,是保留在源码,字节码,或者运行期。自定义注解通常都是使用 @Retention(RetentionPolicy.RUNTIME),即保留到运行期。
使用@Target元注解表示注解的类型,若一个 Annotation 对象是 METHOD 类型,则该 Annotation 只能用来修饰方法。
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
//blabla
}
这样我们就定义了一个运行时注解MyAnnotation,可以用来作用在类、接口或枚举类型上(ElementType.TYPE)。
注解的作用
最后我们来总结下注解的作用:
- 提供信息给编译器: 编译器可以利用注解来检测出错误或者警告信息,打印出日志。
- 编译阶段时的处理: 软件工具可以用来利用注解信息来自动生成代码、文档或者做其它相应的自动处理。
- 运行时处理: 某些注解可以在程序运行的时候接受代码的提取,自动做相应的操作。
我会持续更新关于物联网、云原生以及数字科技方面的文章,用简单的语言描述复杂的技术,也会偶尔发表一下对IT产业的看法,请大家多多关注,欢迎留言和转发,希望与大家互动交流,谢谢。
猜你喜欢
- 2025-07-24 Java变量(java变量有什么作用)
- 2025-07-24 Java编程入门第一课:HelloWorld(java编程从入门到实践)
- 2025-07-24 Java基础教程:Java继承概述(java里继承的概述)
- 2025-07-24 java基础之——访问修饰符(private/default/protected/public)
- 2025-07-24 如何规划一个合理的JAVA项目工程结构
- 2025-05-02 Java 异常知识点一篇没够再来一篇
- 2025-05-02 JVM参数、main方法的args参数使用
- 2025-05-02 别再问Cookie了,再问就崩溃了!(别再问我什么是disco原唱)
- 2025-05-02 Java 如何设计 API 接口,实现统一格式返回?
- 2025-05-02 Java入门:常量变量和数据类型的全部基础知识点
- 1517℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 594℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 521℃MySQL service启动脚本浅析(r12笔记第59天)
- 489℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 488℃启用MySQL查询缓存(mysql8.0查询缓存)
- 476℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 456℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 453℃MySQL server PID file could not be found!失败
- 最近发表
-
- PS所有滤镜的说明(六)(ps滤镜详解)
- 5款小白也能用的在线图片编辑器!电商效率飙升就靠它!
- Java变量(java变量有什么作用)
- Java面试常见问题:Java注解(java中的面试题)
- Java编程入门第一课:HelloWorld(java编程从入门到实践)
- Java基础教程:Java继承概述(java里继承的概述)
- java基础之——访问修饰符(private/default/protected/public)
- 如何规划一个合理的JAVA项目工程结构
- 将机器指令翻译成 JavaScript -- 终极目标
- Web 服务器基准测试:Go vs. Node.js vs. Nim vs. Bun
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)