当前位置:网站首页 > Java基础 > 正文

java基础语言注释



   无论是做Java后台或者Android开发,我们经常使用注解,最常用的莫过于@Override,很多流程的框架都用到了注解这个功能机制,例如Java后台开发中常用的框架Spring、MyBatis等,Android的Retrofit,Butterknife等,都是注解框架。有关注解也常常在面试中被问到,但我们了解注解的本质是什么?有哪些类别?如何自定义及使用?其中工作原理是什么?本文将做全面介绍。

一、注解的定义

关于注解首先引入官方文档的一句话:Java 注解(Annotation)用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。

日常开发中新建Java类,我们使用class、interface比较多,而注解和它们一样,也是一种类的类型,用的修饰符为 @interface

作用:标识 / 解释 Java 代码。

二、注解类型

1、元注解

元注解顾名思义我们可以理解为注解的注解,它是作用在注解中,方便我们使用注解实现想要的功能。元注解分别有@Retention、 @Target、 @Document、 @Inherited和@Repeatable(JDK1.8加入)五种。

@Retention 

 


Retention英文意思有保留、保持的意思,它表示注解存在阶段是保留在源码(编译期),字节码(类加载)或者运行期(JVM中运行)。
在@Retention注解中使用枚举RetentionPolicy来表示注解保留时期
Retention策略 :

@Retention(RetentionPolicy.SOURCE) ,注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS), 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
@Retention(RetentionPolicy.RUNTIME), 注解会在class字节码文件中存在,在运行时可以通过反射获取到

@Target

 

@Target(ElementType.TYPE) 作用接口、类、枚举、注解
@Target(ElementType.FIELD) 作用属性字段、枚举的常量
@Target(ElementType.METHOD) 作用方法
@Target(ElementType.PARAMETER) 作用方法参数
@Target(ElementType.CONSTRUCTOR) 作用构造函数
@Target(ElementType.LOCAL_VARIABLE)作用局部变量
@Target(ElementType.ANNOTATION_TYPE)作用于注解(@Retention注解中就使用该属性)
@Target(ElementType.PACKAGE) 作用于包
@Target(ElementType.TYPE_PARAMETER) 作用于类型泛型,即泛型方法、泛型类、泛型接口 (jdk1.8加入)
@Target(ElementType.TYPE_USE) 类型使用.可以用于标注任意类型除了 class (jdk1.8加入)
一般比较常用的是ElementType.TYPE类型.


@Documented

 

@Inherited

 
 

上面的例子,父类加了可继承注解,子类没有被该注解修饰,但是子类获取Mynnotation注解成功,说明子类继承了父类中的MyAnnotation。

@Repeatable

Repeatable的英文意思是可重复的。顾名思义说明被这个元注解修饰的注解可以同时作用一个对象多次,但是每次作用注解又可以代表不同的含义。

 

2、Java内置注解

定义:即Java内部已经实现好的注解

Java中 内置的注解有5类,具体包括:

@Deprecated:过时注解,用于标记已过时 & 被抛弃的元素(类、方法等)

@Override:复写注解,用于标记该方法需要被子类复写

@SuppressWarnings:阻止警告注解,用于标记的元素会阻止编译器发出警告提醒

@SafeVarargs:参数安全类型注解,用于提醒开发者不要用参数做不安全的操作 & 阻止编译器产生 unchecked警告,Java 1.7 后引入

 

@FunctionalInterface:函数式接口注解,数式接口 (Functional Interface) = 1个具有1个方法的普通接口,Java 1.8 后引入的新特性

 

3、自定义注解


定义:开发者自定义注解
下一节介绍如何自定义注解,及学习注解属性和如何获取注解的属性。

三、注解的使用

1、定义注解

定义注解形式类似接口,只是在interface前面加@:

 


2、注解属性

注解的本质就是一个Annotion接口。

 
 
 
 
 

基本数据类型
String
枚举类型
注解类型
Class类型
以上类型的一维数组类型


3、使用注解

 


4、获取注解


前面介绍Java自带的注解和如何自定义注解,如何使用,接下来学习如何获取注解,这是使用注解的关键,而使用注解的目的是为了获取注解属性值。
如何获取注解?当然是Java的反射技术了。

用于Java反射会带来一定的耗时,因此使用运行注解需要考虑对性能的影响。

获取注解的方法:

 
 
 

获取注解及注解属性的示例:

 
 
java基础语言注释
 

四、注解的应用

按照注解的Retention属性其应用分为3个场景:

1  提供信息给编译器: 编译器可以利用注解来检测出错误或者警告信息,打印出日志。
2  编译阶段时的处理: 软件工具可以用来利用注解信息来自动生成代码、文档或者做其它相应的自动处理。
3 运行时处理: 某些注解可以在程序运行的时候接受代码的提取,自动做相应的操作。


应用举例

应用场景1:测试代码

如出名的测试框架JUnit = 采用注解进行代码测试。

 
 

应用场景2:解耦&简化代码,提高开发效率

Android 开发中大名鼎鼎的 IOC 框架ButterKnife,它减少了大量重复的代码。

 
 
 


五、注解的工作原理

编译时处理需要使用到APT技术,该技术提供了一套编译期的注解处理流程。

在编译期扫描.java文件的注解,并传递到注解处理器,注解处理器可根据注解生成新的.java文件,这些新的.java问和原来的.java一起被javac编译。

注解处理器是一个在javac编译期处理注解的工具,你可以创建注解处理器并注册,在编译期你创建的处理器以Java代码作为输入,生成文件.java文件作为输出。注解处理器不能修改已有的Java类,只能生成新的Java类。

六、总结

  • 上一篇: 基础Java总结
  • 下一篇: java基础电子书下载
  • 版权声明


    相关文章:

  • 基础Java总结2025-04-21 10:26:06
  • java基础代码意思2025-04-21 10:26:06
  • java基础最全2025-04-21 10:26:06
  • java基础加强分析2025-04-21 10:26:06
  • java基础学了2025-04-21 10:26:06
  • java基础电子书下载2025-04-21 10:26:06
  • 暴力的java基础2025-04-21 10:26:06
  • java零基础教程下载2025-04-21 10:26:06
  • java线程基础题2025-04-21 10:26:06
  • java基础语句训练2025-04-21 10:26:06