Java中的注解与五种元注解的使用

本文详细介绍了Java注解的定义、使用方法、元注解以及预制注解。注解用于在编译、类加载和运行时进行处理,可以通过@Retention、@Documented、@Target、@Inherited和@Repeatable等元注解定制其行为。同时,文章列举了Java中常见的预制注解,如@author、@version等,并展示了如何自定义注解和处理重复注解。

注解的概念

注解(Annotation)又叫做标注,是Java5之后开始增加的一种引用数据类型。注解本质上是代码中的一种特殊标记,通过这些标记可以在编译、类加载、运行阶段进行相应的处理。

注解的使用

注解的定义如下:
访问修饰符 @interface 自定义注解名称{		     
	注解成员
}

(1)自定义注解自动继承java.lang.annotation.Annotation接口。
(2)通过注解可以修饰包、类、接口、构造方法、成员方法、成员变量、参数,局部变量的声明。

注解的使用方法:

(1)注解中只有成员变量没有成员方法,成员变量通过"无参的方法"来声明,其方法名定义了该成员变量的名称,返回值定义类成员变量的类型。

//定义名为Person的注解
public @interface Person{
	int value();//此处的无参方法的形式表示int类型名为成员变量
}

在使用没有给成员变量赋初始值的注解时,需要在注解中输入初始值

public class AnnotationTest {
   	//给AnnotationTest类中的show方法提供Person注解
    @Person(value = "1") //给成员变量赋初始值
    public static void show(){

    }
}

也可以在注解声明时给予成员变量一个默认的值,则使用该注解时可以不对成员变量赋值。修改Person注解如下:

//定义名为Person的注解
public @interface Person{
	int value() default 1;//给成员变量赋初始值
}

此时可以不对成员变量赋值,直接使用注解

public class AnnotationTest {
    @Person //给AnnotationTest类中的show方法提供Person注解
    public static void show(){

    }
}

(2)如果注解只有一个成员变量,则建议起名为value,且成员变量的类型只能是八种基本数据类型,Class类型,String类型,Enum类型,Annotation类型。

元注解

元注解的基本概念

(1)元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。
(2)元注解主要有:@Retention,@Documented,@Target,@Inherited,@Repeatable

元注解一:@Retention

该元注解应用于一个注解用于说明该注解的生命周期,其成员变量的取值可以有如下三种:
(1)RetentionPolicy.SOURCE :表示修饰的注解只能保留在源码阶段,在编译器进行编译阶段时它将被丢弃。
(2)RetentionPolicy.CLASS:表示修饰的注解经过编译阶段后可以被保留在.Class字节码文件中,但并不会被加载进JVM中,且这是默认的方法。
(3)RetentionPolicy.RUNTIME:表示修饰的注解将被保留至运行阶段,将被加载进JVM中,在程序运行时可以被获取到。
简单使用如下:

//使用@Retention修饰Person注解,使其可以可存在于运行阶段
@Retention(RetentionPolicy.RUNTIME)
public @interface Person {
    int value() default 1;
}
元注解二:@Documented

(1)@Documented注解应用于一个注解时,该注解可以被javadoc工具提取并在文档中显示。 使用javadoc工具可以从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档,而该工具抽取时默认不包括注解内容。
(2)定义为Documented的注解必须设置Retention的值为RUNTIME。
简单使用如下:


@Documented  //使用@Documented注解使Person注解可被提取为文档
//使用@Retention修饰Person注解,使其可以可存在于运行阶段
@Retention(RetentionPolicy.RUNTIME)  
public @interface Person {
    int value() default 1;
}

通过javadoc工具提取AnnotationTest类的文档后,在文档中可以发现Person注解的存在,如图
在这里插入图片描述

元注解三:@Target

@Target用于指定被修饰的注解能用于哪些元素的修饰,取值如下:

变量取值可注解类型
ElementType.ANNOTATION_TYPE可以给一个注解进行注解
ElementType.CONSTRUCTOR可以给构造方法进行注解
ElementType.FIELD可以给属性进行注解
ElementType.LOCAL_VARIABLE可以给局部变量进行注解
ElementType.METHOD可以给方法进行注解
ElementType.PACKAGE可以给一个包进行注解
ElementType.PARAMETER可以给一个方法内的参数进行注解
ElementType.TYPE可以给类型进行注解,比如类、接口、枚举

从Java8开始对元注解@Target的参数类型ElementType枚举值增加了两个

变量取值可注解类型
ElementType.TYPE_PARAMETER表示该注解能写在类型变量的声明语句中,如:泛型
ElementType.TYPE_USE表示该注解能写在使用类型的任何语句

使Person注解只可以修饰方法

//Person注解只能修饰方法
@Target(ElementType.METHOD)
//使用@Documented注解使Person注解可被提取为文档
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Person {
    int value() default 1;
}

此时用Person注解修饰AnnotationTest类时,则会报出无法修饰TYPE类型的错误。

元注解四:@Inherited

@Inherited并不是说注解本身可以继承,而是说如果一个超(父)类被该注解标记过的注解进行注解时,如果子类没有被任何注解应用时,则子类就继承超(父)类的注解。

元注解五:@Repeatable

@Repeatable表示自然可重复的含义,从Java8开始增加的新特性。
如果想对show方法作两次变量值不同的注解,则使用两次Person注解将会报错

public class AnnotationTest {
    @Person(1) //将会报错
    @Person(2)
    public static void show(){

    }
}

(1)在Java8之前通过声明一个新注解Persons,其成员变量的类型为Person数组来解决。

public @interface Persons {
    Person[] value();
}
public class AnnotationTest {
    @Persons({@Person(1),@Person(2)})
    public static void show(){

    }
}

这样就达到了使用两次注解的目的
(2)使用@Repeatable注解的方式解决

//使用Repeatable注解,参数需要是class的对象
@Repeatable(Persons.class)
@Target({ElementType.METHOD,ElementType.TYPE_USE})
//使用@Documented注解使Person注解可被提取为文档
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Person {
    int value() default 1;
}

而且此时Persons的生命周期、目标注解类型需要和Person相同

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE_USE})
public @interface Persons {
    Person[] value();
}

此时再进行重复的注解将没有问题

public class AnnotationTest {
    @Person(1)
    @Person(2)
    public static void show(){

    }
}

预制注解

• 预制注解就是Java语言自身提供的注解,具体如下

注解名称功能
@author标明开发该类模块的作者,多个作者之间使用,分割
@version标明该类模块的版本
@see参考转向,也就是相关主题
@since从哪个版本开始增加的
@param对方法中某参数的说明,如果没有参数就不能写
@return对方法返回值的说明,如果方法的返回值类型是void就
不能写
@exception对方法可能抛出的异常进行说明
@Override限定重写父类方法, 该注解只能用于方法
@Deprecated用于表示所修饰的元素(类, 方法等)已过时
@SuppressWarnings抑制编译器警告
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值