Java注解Annotation

一.认识注解

1.注解(Annotation),是一种元数据(用来描述数据的数据),它们可以在Java源代码中添加额外的信息,这些信息可以被编译器、工具和运行时环境使用。Java注解可以用来提供类、方法、字段或其他程序元素的附加信息,以及在编译时执行某些任务。

2.注释(Comment)与注解(Annotation)的差别

//学习
public void study(){}

@Override
public void study(){}

(1)注释(Comment)是给人看的,用于对程序逻辑做出解释,并不作为程序的一部分,对程序的执行并不造成任何影响。程序在被编译成.class字节码文件时会删去注释内容。

(2)注解(Annotation)既是给人看的,也是给编译器看的,注解既能对程序做出解释(和注释功能相同),又能被编译器读取并执行相应功能,是程序的一部分。 

二.使用注解

注解可以分为三类,分别是内置注解、元注解和自定义注解。

1.内置注解

内置注解是jdk已经定义好释义的注解,开发者可直接使用,有三种。

(1)@Override:表示要重写父类的方法

(2)@Deprecated:表示该方法已经废弃,不建议使用。(只是不建议,但还是能用)

(3)@SuppressWarnings:用来抑制编译时的警告信息,需传递参数。

        @SuppressWarnings("all"):表示抑制所有警告信息

        @SuppressWarnings("unchecked"):表示抑制未检查的警告信息

2.元注解meta-annotation

元注解是用于注释注解的注解,需要对自定义注解进行注解时,就使用元注解,有四种。

(1)@Target():表明注解的适用对象,需传递参数。

        @Target(value = ElemType.METHOD):表明该自定义注解仅适用于方法

        当适用对象有多个时,传递的参数是一个集合

        @Target(value = {ElemType.METHOD, ElemType.TYPE}):表明该自定义注解适用于方法和类。

(2)@Retention():表明注解的存活周期,即注解能保留到什么时候,需传递参数。

        @Retention(value = RetentionPolicy.SOURCE):注解只能存活在编辑时的源码

        @Retention(value = RetentionPolicy.CLASS):注解能存活到编译后的类

        @Retention(value = RetentionPolicy.RUNTIME):注解能存活到程序成功运行完毕

        存活时间:SOURCE < CLASS < RUNTIME ,一般是使用RUNTIME

(3)@Document:表明该注解将JavaDoc中。

(4)@Inherited:表明该类的子类可以继承此注解

3.自定义注解

开发人员可以自己编写一个注解,但Java对自定义注解的编写做出规范。

(1)自定义注解的格式:权限修饰符 + @interface + 注解名 + {定义内容}

public @interface MyAnnotation {}

自定义注解跟自定义接口的格式是一样的,因为注解本质就是一个继承Annotation接口的特殊接口。

(2)定义注解元素的格式:参数类型 + 参数名 + ();

public @interface MyAnnotation {
    String name();
}

定义注解元素的格式跟定义接口中抽象方法的格式是一样的,但在定义注解元素时还可以加入默认值。

(3)定义注解元素的默认值:注解元素一定要有值,若注解内未定义默认值,则使用注解时一定要传值。定义有默认值的注解元素的格式为:参数类型 + 参数名 + () default + 值

public @interface MyAnnotation1 {
    String name() default "ZhangSan";
    String number() default ""
    int age();
    String[] schools() default {"S1","S2"};
}

经常使用空字符串、数字0来作为默认值,若默认值为-1则代表该元素不存在。

(4)若注解元素只有一个,则默认定义参数名为value;当参数只有value时,使用注解时传值可以直接写,而不用value = ;

public @interface MyAnnotation2 {
    String value() default "";
}    

(5)使用

//用元注解Target来声明自定义注解MyAnnotation1的使用范围
@Target(ElemType.TYPE)
//接下来是自定义注解MyAnnotation1
@interface MyAnnotation1 {
    String name() default "ZhangSan";
    String number() default ""
    int age();
    String[] schools() default {"S1","S2"};
}

//使用自定义注解MyAnnotation1来注解类。MyAnnotation1中的注解元素只有age没有默认值,因此只需传age的值
@MyAnnotation1(age = 18)
public void Student{}
//用元注解Target来声明自定义注解MyAnnotation2的使用范围
@Target(ElemType.TYPE)
//接下来是自定义注解MyAnnotation2
@interface MyAnnotation2 {
    String value();
}

//使用自定义注解MyAnnotation2来注解类。
/*
*MyAnnotation2的元素只有一个,所以命名为value,
*value没有默认值,所以使用注解时要传值
*而当命名为value时,传值无需写value = 
*/
@MyAnnotation2("GOOD")
public void Student{}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值