注解
注解就是对一段程序进行标注和解释的
举例:
注解名 | 说明 |
---|---|
@Override | 描述子类重写父类方法 |
@Deprecated | 描述方法过时 |
@SuppressWarnings | 压制警告 |
注解和注释的区别:
注解 | 注释 |
---|---|
给编译器看的(代表了程序的一些特殊功能) | 给程序员看的 |
如何自定义注解?
格式
public @interface 注解名称{
public 属性类型 属性名() default 默认值;
}
举例:
public @interface Anno1{
public int a() default 10;
}
注:属性类型包括:基本数据类型、String、Class、注解、枚举、以上类型的一维数组。
package com.test4.test40;
/**
* @author zhangzengxiu
* @date 2021/12/1
*/
public @interface AnnoTest {
/**
* 基本数据类型、String、Class、注解、枚举、以上类型的一维数组。
*/
//基本数据类型
int a() default 10;//public可以省略不写 默认就是public
//String
public String name();
//Class
public Class clazz() default AnnoTest02.class;
//注解
public AnnoTest02 anno() default @AnnoTest02;
//枚举
public Season season() default Season.AUTUMN;
//以上类型的一维数组 基本数据类型
public int[] arr() default {1, 2, 3, 4, 5};
//枚举数组
public Season[] seasons() default {Season.AUTUMN, Season.SUMMER};
}
使用自定义注解:
package com.test4.test40;
/**
* @author zhangzengxiu
* @date 2021/12/1
*/
@AnnoTest(name = "xxx")
public class AnnoDemo {
}
注:如果在定义注解的过程中,属性没有给定指定默认值,那么在使用时就需要手动给出注解属性的设置值
特殊属性value:
自定义注解:
package com.test4.test40;
public @interface AnnoTest02 {
public String value();
}
使用注解:
package com.test4.test40;
/**
* @author zhangzengxiu
* @date 2021/12/1
*/
@AnnoTest02("默认给value属性赋值")
public class AnnoDemo02 {
}
元注解:
元注解是用来描述注解的注解。
常见元注解:
元注解名 | 说明 |
---|---|
@Target | 指定了注解能在哪里使用 |
@Retention | 可以理解为注解的生命周期,默认只存在java源码阶段,编译为字节码问价就会消失 |
@Inherited | 表示修饰的自定义注解可以被子类继承 |
@Documented | 表示该自定义注解,会出现在API文档里面 |
举例说明:
import java.lang.annotation.*;
@Target({ElementType.TYPE,//可以使用在类上
ElementType.FIELD,//可以使用在成员变量上
ElementType.METHOD//可以使用在方法上
})
@Retention(RetentionPolicy.RUNTIME)//指定注解的存活时间,不写默认只存活于源码阶段
@Inherited//指定该注解可以被继承
public @interface AnnoTest02 {
public String value();
}
完整的自定义注解:
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})//标明这个注解可以用在哪儿
@Retention(RetentionPolicy.RUNTIME)//指定注解的存活时间
@Inherited//指定该注解可以被继承
public @interface AnnoTest03 {
public String value();
}