java注解基础

一、什么是注解

在JDK 5中引入了源代码中的注解(annotation)这一机制。注解使得Java源代码中不但可以包含功能性的实现代码,还可以添加元数据。注解的功能类似于代码中的注释,所不同的是注解不是提供代码功能的说明,而是实现程序功能的重要组成部分。Java注解已经在很多框架中得到了广泛的使用,用来简化程序中的配置。

二、基本Annotation

JDK默认提供了如下几个基本Annotation:

2.1@Override

限定重写父类方法。对于子类中被@Override 修饰的方法,如果存在对应的被重写的父类方法,则正确;如果不存在,则报错。@Override 只能作用于方法,不能作用于其他程序元素。

2.2@Deprecated

用于表示某个程序元素(类、方法等)已过时。如果使用被@Deprecated修饰的类或方法等,编译器会发出警告。

2.3@SuppressWarning

抑制编译器警告。指示被@SuppressWarning修饰的程序元素(以及该程序元素中的所有子元素,例如类以及该类中的方法…..)取消显示指定的编译器警告。例如,常见的@SuppressWarning(value=”unchecked”)

2.4@SafeVarargs

@SafeVarargs是JDK 7 专门为抑制“堆污染”警告提供的。

三、元注解

在定义Annotation时,也可以使用JDK提供的元注解来修饰Annotation定义。JDK提供了如下4个元注解(注解的注解,不是上述的”元数据Annotation“):

@Retention

@Target

@Documented

@Inherited

3.1 @Retention

@Retention用于指定Annotation可以保留多长时间。

@Retention包含一个名为“value”的成员变量,该value成员变量是RetentionPolicy枚举类型。使用@Retention时,必须为其value指定值。value成员变量的值只能是如下3个:

RetentionPolicy.SOURCE:Annotation只保留在源代码中,编译器编译时,直接丢弃这种Annotation。

RetentionPolicy.CLASS:编译器把Annotation记录在class文件中。当运行Java程序时,JVM中不再保留该Annotation。

RetentionPolicy.RUNTIME:编译器把Annotation记录在class文件中。当运行Java程序时,JVM会保留该Annotation,程序可以通过反射获取该Annotation的信息。

3.2 @Target

@Target指定Annotation用于修饰哪些程序元素。@Target也包含一个名为”value“的成员变量,该value成员变量类型为ElementType[ ],ElementType为枚举类型,值有如下几个:

ElementType.TYPE:能修饰类、接口或枚举类型

ElementType.FIELD:能修饰成员变量

ElementType.METHOD:能修饰方法

ElementType.PARAMETER:能修饰参数

ElementType.CONSTRUCTOR:能修饰构造器

ElementType.LOCAL_VARIABLE:能修饰局部变量

ElementType.ANNOTATION_TYPE:能修饰注解

ElementType.PACKAGE:能修饰包

3.3 @Documented

如果定义注解A时,使用了@Documented修饰定义,则在用javadoc命令生成API文档后,所有使用注解A修饰的程序元素,将会包含注解A的说明。

3.4 @Inherited

@Inherited指定Annotation具有继承性。

四、自定义注解

4.1、没有方法的注解

//此处注解没有任何方法
public @interface Test{
}

//在使用该注解时候,直接用,什么都不需要加就可以
@Test
public class Person {

    public Person(){

    }
}

4.2、带有方法的注解

public @interface Test {

    /*
     * Annotation的成员变量在Annotation定义中以“无形参的方法”形式来声明,
     * 其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。
     * */
    int id();
    String name();
}

//一旦在注解里面写了方法,那么在使用注解的时候就必须要加参数

//一旦在Annotation里定义了成员变量后,使用该Annotation时就应该为该Annotation的成员变量指定值。
@Test(id = 1,name = "COM")
public class Person {

    public Person(){

    }
}

4.3、指定默认值的注解

public @interface Test {

    /*
     * 此处给自定义Annotation的每个方法都指定了一个默认值
     * */
    int id() default 1;
    String name() default "csa";
}

//使用带有默认值的Annotation

//Annotation的成员变量已经指定了默认值,使用该Annotation时可以不为这些成员变量指定值,而是直接使用默认值。
@Test
public class Person {

    public Person(){

    }
}

根据Annotation是否包含成员变量,可以把Annotation分为如下两类:

标记Annotation:没有成员变量的Annotation被称为标记。这种Annotation仅用自身的存在与否来为我们提供信息,例如@override等。

元数据Annotation:包含成员变量的Annotation。因为它们可以接受更多的元数据,因此被称为元数据Annotation。

五、注解的意义

为编译器提供辅助信息 — Annotations可以为编译器提供而外信息,以便于检测错误,抑制警告等.

编译源代码时进行而外操作 — 软件工具可以通过处理Annotation信息来生成原代码,xml文件等等.

运行时处理 — 有一些annotation甚至可以在程序运行时被检测,使用.

总之,注解是一种元数据,起到了”描述,配置“的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值