Java注解总结(史上最全,有这一篇就够了)

您所在的位置:网站首页 java基本语句有哪些类型 Java注解总结(史上最全,有这一篇就够了)

Java注解总结(史上最全,有这一篇就够了)

2024-04-18 08:21| 来源: 网络整理| 查看: 265

欢迎大家关注Java经验分享,里面大量BATJ面试题,Java技术干货、行业杂谈,也欢迎大家投稿~什么是注解?注解的定义

官网描述如下:

Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。

将上面的话再翻译一下,如下:(1)元数据在开发中的作用就是做数据约束和标准定义,可以将其理解成代码的规范标准(代码的模板);(2)代码的模板(元数据)不直接影响代码的执行,它只是帮助我们来更快捷的开发;

综上,注解是一种元数据,可以将它理解为注释、解释,它为我们在代码中添加信息提供了一种形式化的方法,它用于帮助我们更快捷的写代码。

注解的分类

一般常用的注解可以分为三类:

1、Java自带的标准注解包括@Override、@Deprecated、@SuppressWarnings等,使用这些注解后编译器就会进行检查。

2、元注解元注解是用于定义注解的注解,包括@Retention、@Target、@Inherited、@Documented、@Repeatable 等。元注解也是Java自带的标准注解,只不过用于修饰注解,比较特殊。

3、自定义注解用户可以根据自己的需求定义注解。

注解的使用

使用Java自带的注解Java 自带的注解,就是 java.lang中定义的一套注解,以Override注解为例,使用方法如下:

@Override //在需要注解的方法上面@Override即可 protected void onCreate() { }

常用的Java注解如下:

1、@Deprecated – 所标注内容不再被建议使用;2、@Override – 只能标注方法,表示该方法覆盖父类中的方法;3、@Documented --所标注内容可以出现在javadoc中;4、@Inherited – 只能被用来标注“Annotation类型”,它所标注的Annotation具有继承性;5、@Retention – 只能被用来标注“Annotation类型”,而且它被用来指定Annotation的RetentionPolicy属性;6、@Target – 只能被用来标注“Annotation类型”,而且它被用来指定Annotation的ElementType属性;7、@SuppressWarnings – 所标注内容产生的警告,编译器会对这些警告保持静默;8、@interface – 用于定义一个注解;

其中,4、5、6、8多用于自定义注解,读者着重记一下。

自定义注解

在Java中,我们使用@interface注解来自定义一个注解,如下:

public @interface MyTestAnnotation { }

此时,我们已经定义了一个注解MyTestAnnotation ,接着我们就可以在类或者方法上作用我们刚刚新建的注解:

@MyTestAnnotation public class Test { @MyTestAnnotation public static void testString(){ } }

此时,我们已经自定义了一个注解,不过现在这个注解毫无意义。

要如何使注解工作呢?这就需要使用元注解了。

常用的元注解有@Retention、 @Target、 @Document、 @Inherited和@Repeatable五个。

@RetentionRetention英文意思有保留、保持的意思,它表示注解存在阶段是保留在源码(编译期),字节码(类加载)或者运行期(JVM中运行)。

在@Retention注解中使用枚举RetentionPolicy来表示注解保留时期:

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

如果我们是自定义注解,则通过前面分析,我们自定义注解如果只存着源码中或者字节码文件中就无法发挥作用,而在运行期间能获取到注解才能实现我们目的,所以自定义注解中肯定是使用 @Retention(RetentionPolicy.RUNTIME),如下:

@Retention(RetentionPolicy.RUNTIME) public @interface MyTestAnnotation { }

@TargetTarget的英文意思是目标,这也很容易理解,使用@Target元注解表示我们的注解作用的范围就比较具体了,可以是类,方法,方法参数变量等,同样也是通过枚举类ElementType表达作用类型:

@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类型,如下:

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface MyTestAnnotation { }

@DocumentedDocument的英文意思是文档。它的作用是能够将注解中的元素包含到 Javadoc 中去。

@InheritedInherited的英文意思是继承,但是这个继承和我们平时理解的继承大同小异,一个被@Inherited注解了的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。

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

注解的源码分析我们以@Override注解为例,来分析其源码,想查看一个普通类一样,按住ctrl键点击@Override即可进入其源码,如下:

@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }

我们看到@Override注解就是通过@interface注解定义的一个普通注解,而我们知道,使用 @interface 定义注解时,意味着它实现了 java.lang.annotation.Annotation 接口,即该注解就是一个Annotation

注意:定义 Annotation 时,@interface 是必须的,它和我们通常的 implemented 实现接口的方法不同。Annotation 接口的实现细节都由编译器完成。通过 @interface 定义注解后,该注解不能继承其他的注解或接口。

下面我们来分析一下Annotation 类的源码,如下:

public interface Annotation { boolean equals(Object var1); int hashCode(); String toString(); Class


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3