介绍
- 简介
- Java注解提供了关于代码的一些信息, 但并不直接作用于它所注解的代码内容。在这个教程当中, 我们将学习Java的注解, 如何定制注解, 注解的使用以及如何通过反射解析注解。
创建Java自定义注解
- 介绍
- 创建自定义注解和创建一个接口相似, 但是注解的interface关键字需要以@符号开头。我们可以为注解声明方法。我们先来看看注解的例子, 然后我们将讨论他的一些特性。
- 描述
- 注解方法不能带有参数。
- 注解方法返回值类型限定为:基本类型、String、Enums、Annotation或者是这些类型的数组。
- 注解方法可以有默认值。
- 注解本身能够包含元注解, 元注解被用来注解其它注解。
- 这里有四种类型的元注解:
- @Documented —— 指明拥有这个注解的元素可以被javadoc此类的工具文档化。
- @Target——指明该类型的注解可以注解的程序元素的范围。该元注解的取值可以为TYPE[类型], METHOD[方法], CONSTRUCTOR[构造函数], FIELD[反射]等。
- @Inherited——指明该注解类型被自动继承。
- @Retention——指明了该Annotation被保留的时间长短。
- 声明注解函数类
| |
| |
| |
| @Documented |
| @Target(ElementType.METHOD) |
| @Inherited |
| @Retention(RetentionPolicy.RUNTIME) |
| public @interface MethodInfo { |
| |
| String author() default "靳露露"; |
| |
| String date(); |
| |
| int revision() default 1; |
| |
| String comments(); |
| } |
我们来看一个Java内建注解的例子参照上边提到的自定义注解。
| |
| |
| |
| public class AnnotationExample { |
| |
| public static void main(String[] args) { |
| genericsTest(); |
| } |
| |
| |
| @Override |
| @MethodInfo(author = "靳瑶瑶", comments = "Main method", date = "2012 年 11 月 17 日", revision = 1) |
| public String toString() { |
| return "覆盖 toString 方法"; |
| } |
| |
| |
| @Deprecated |
| @MethodInfo(comments = "deprecated method", date = "2012 年 11 月 17 日") |
| public static void oldMethod() { |
| System.out.println("老方法, 别用了。"); |
| } |
| |
| |
| @SuppressWarnings({"unchecked", "deprecation"}) |
| @MethodInfo(author = "靳瑶瑶", comments = "Main method", date = "2012 年 11 月 17 日", revision = 10) |
| public static void genericsTest() { |
| List<String> list = new ArrayList(); |
| Collections.addAll(list, "abc"); |
| System.out.println(JSON.toJSON(list)); |
| oldMethod(); |
| } |
| } |
Java注解解析
- 我们将使用反射技术来解析Java类的注解。那么注解的 RetentionPolicy[定义] 应该设置为RUNTIME否则Java类的注解信息在执行过程中将不可用, 那么我们也不能从中得到任何和注解有关的数据。
| |
| |
| |
| public class AnnotationParsing { |
| |
| public static void main(String[] args) { |
| try { |
| for (Method method : AnnotationParsing.class |
| .getClassLoader() |
| .loadClass(("com.example.demo.Demo.test.AnnotationExample")) |
| .getMethods()) { |
| |
| if (method.isAnnotationPresent(com.example.demo.Demo.util.MethodInfo.class)) { |
| try { |
| |
| for (Annotation anno : method.getDeclaredAnnotations()) { |
| System.out.println("方法中的注解 : " + anno); |
| } |
| |
| MethodInfo methodAnno = method.getAnnotation(MethodInfo.class); |
| if (methodAnno.revision() == 1) { |
| |
| |
| } |
| } catch (Throwable ex) { |
| ex.printStackTrace(); |
| } |
| } |
| } |
| } catch (SecurityException | ClassNotFoundException e) { |
| e.printStackTrace(); |
| } |
| } |
| } |
输出
- 文本
| 方法中的注解 : @com.example.demo.Demo.util.MethodInfo(author=靳瑶瑶, revision=1, comments=Main method, date=2012 年 11 月 17 日) |
| 方法中的注解 : @java.lang.Deprecated() |
| 方法中的注解 : @com.example.demo.Demo.util.MethodInfo(author=靳露露, revision=1, comments=deprecated method, date=2012 年 11 月 17 日) |
| 方法中的注解 : @com.example.demo.Demo.util.MethodInfo(author=靳瑶瑶, revision=10, comments=Main method, date=2012 年 11 月 17 日) |
Java内建注解
- 常见注解
- Java提供了三种内建注解。
- @Override——当我们想要复写父类中的方法时, 我们需要使用该注解去告知编译器我们想要复写这个方法。这样一来当父类中的方法移除或者发生更改时编译器将提示错误信息。
- @Deprecated——当我们希望编译器知道某一方法不建议使用时, 我们应该使用这个注解。Java在javadoc 中推荐使用该注解, 我们应该提供为什么该方法不推荐使用以及替代的方法。
- @SuppressWarnings——这个仅仅是告诉编译器忽略特定的警告信息, 例如在泛型中使用原生数据类型。它的保留策略是SOURCE(译者注:在源文件中有效)并且被编译器丢弃。
默认传参


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~