zoukankan      html  css  js  c++  java
  • Java学习——注解

    Java学习——注解

    摘要:本文主要介绍了Java开发常用的注解,以及如何自定义注解。

    部分内容来自以下博客:

    https://www.cnblogs.com/Qian123/p/5256084.html

    https://www.cnblogs.com/xd502djj/p/2610040.html

    https://www.cnblogs.com/peida/p/3036689.html

    什么是注解以及为什么要使用注解

    从JDK1.5开始,JAVA增加了对元数据(描述数据属性的信息)的支持。其实说白就是代码里的特殊标志,这些标志可以在编译类加载运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部署。

    注解的分类

    按运行机制

    源码注解,这种注解只在源码阶段存在存在。

    编译注解,注解不但在源码中存在,而且在class文件中也存在,JDK自带的注解就是属于这种类型的注解。

    运行时注解,即便到在运行阶段仍然起作用的注解,第三方提供的注解大部分是属于这种类型的注解。

    按来源分类

    JDK自带的注解。

    第三方的注解。

    自定义注解。

    按功能分类

    普通注解,对程序和代码进行标注的注解。

    元注解,对注解标记的注解。

    Java中常见的注解

    JDK自带注解

    @Override:表示覆盖或重写父类的方法。

    @Deprecated:表示该方法已经过时了,不建议使用。

    @SuppressWarnings:表示忽略指定警告。

    第三方注解

    有很多第三方框架会有自己的注解,比如Spring框架中的@AutoWired注解。

    自定义注解

    开发者自己定义的注解。

    元注解

    元注解的作用就是负责注解其他注解。

    @Target

    作用:

    用于描述注解的使用范围,即被描述的注解可以用在什么地方。

    取值:

    ElementType.PACKAGE:包。

    ElementType.TYPE:接口、类、枚举。

    ElementType.FIELD:字段、枚举的常量。

    ElementType.METHOD:方法。

    ElementType.PARAMETER:方法参数。

    ElementType.CONSTRUCTOR:构造函数。

    ElementType.LOCAL_VARIABLE:局部变量。

    ElementType.ANNOTATION_TYPE:注解。

    @Retention

    作用:

    用于描述注解的生命周期,即被描述的注解在什么范围内有效。

    取值:

    RetentionPolicy.SOURCE:注解仅存在于源码中,在class字节码文件中不包含。

    RetentionPolicy.CLASS:默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得。

    RetentionPolicy.RUNTIME:注解会在class字节码文件中存在,在运行时可以通过反射获取到。

    @Inherited

    作用:

    用于说明这个注解是可以被继承的。如果一个使用了@Inherited修饰的注解类型被用于一个class,则这个注解将被用于该class的子类。

    注意:

    @Inherited是会被注解标记的class的子类所继承。类并不从它所实现的接口继承注解,方法并不从它所重载的方法继承注解。

    当@Inherited的注解的@Retention是RetentionPolicy.RUNTIME时,反射API会增强这种继承性。如果我们使用反射去查询一个@Inherited的注解时,反射代码检查将展开工作:检查class和其父类,直到发现指定的注解,或者到达类继承结构的顶层。

    @Documented

    作用:

    用于描述注解可以被放到文档里。

    自定义注解

    使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。

    @interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、Enum)。可以通过default来声明参数的默认值。

    自定义注解格式

    1 public @interface 注解名称 {
    2     // 若干参数
    3     修饰符 类型 名称() default 默认值;
    4 }

    注解参数

    修饰符:

    只能用public默认(default)这两个访问权限修饰符。

    类型:

    只能用byte、short、char、int、long、float、double、boolean八种基本数据类型和String、Enum、Class、Annotations等数据类型,以及这一些类型的数组。

    名称:

    可以自定义,如果只有一个参数成员,最好把参数名称设为value,不要忘了后加小括号。

    default 默认值:

    注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此,使用空字符串或0作为默认值是一种常用的做法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,因为每个注解的声明中,所有元素都存在,并且都具有相应的值,为了绕开这个约束,我们只能定义一些特殊的值,例如空字符串或者负数,表示某个元素不存在,在定义注解时,这已经成为一个习惯用法。

    自定义注解并使用

    自定义注解代码如下:

    1 @Target({ElementType.METHOD, ElementType.PACKAGE, ElementType.TYPE})
    2 @Retention(RetentionPolicy.SOURCE)
    3 @Documented
    4 @Inherited
    5 public @interface TestAnnotation {
    6     public String value() default "";
    7     public String name();
    8     public int age();
    9 }

    使用注解的代码如下:

    1 @TestAnnotation(age = 0, name = "")
    2 public class Demo {
    3     public static void main(String[] args) {
    4         System.out.println();
    5     }
    6 }
  • 相关阅读:
    Unity中的Path对应各平台中的Path
    C#里的装箱、装箱和值类型、引用类型
    unity3D自适应分辨率
    python中的-m参数
    手动安装python包
    python生成器
    HDU 1312 Red and Black(bfs)
    HDU 2553 N皇后问题(dfs)
    HDU1043 Eight(BFS)
    UVa230 Borrowers (STL)
  • 原文地址:https://www.cnblogs.com/shamao/p/10951216.html
Copyright © 2011-2022 走看看