Java从入门到放弃36—内置注解/元注解/自定义注解
01 注解的概念
- Annotation是从JDK5.0开始引入的技术
- Annotation的作用:
- 可以对程序做出解释(这一点和注释comment没什么区别)
- 可以被其他程序读取
- 格式:
- @注解名(value=""),还可以添加一些参数值
- 位置:
- 可以附加在package class method field等上面
##02 内置注解
@Override
- 定义在java.lang.Override中,此注释只适用于修辞方法,用于声明此方法将要重写父类方法
@Deprecated
- 可用于修辞方法,属性,类,被修辞的即为不鼓励程序员使用的程序元素。表示不推荐使用,但是可以使用。如被修辞的方法即为已过时的方法,不鼓励使用,但是可以使用。
@SuppressWarnings( )
-
用来取消显示指定的编译器警告。与前两个内置注解有所不同的是,该注解需要添加一个参数才可以正确使用。参数是已经定义好的,选择后使用即可。如下所示:
-
@SuppressWarnings("all") //镇压全部警告 不建议使用 因为使用该注解后,IDEA不再智能提示黄色警告 @SuppressWarnings("unchecked") @SuppressWarnings(value={"unchecked","deprecation"}) //等等...
-
03 元注解
-
用于注释其他注解,Java定义了4个标准的meta-annotation
- Target 注释作用域,用于描述注解的使用范围(格式示例:@Target(value = {ElementType.TYPE,ElementType.METHOD}))
ElementType.ANNOTATION_TYPE 注释类型声明 ElementType.CONSTRUCTOR 构造方法声明 ElementType.FIELD 字段声明(包括枚举常量) ElementType.LOCAL_VARIABLE 局部变量声明 ElementType.METHOD 方法声明 ElementType.PACKAGE 包声明 ElementType.PARAMETER 参数声明 ElementType.TYPE 类、接口(包括注释类型)或枚举声明
- Retention 用于描述注解的生命周期,表示需要在什么级别保存该注释信息(描述注解在哪个地方有用)
RetentionPolicy.CLASS 编译器将把注释记录在类文件中,但在运行时 JVM 不需要保留注释。 RetentionPolicy.RUNTIME 编译器将把注释记录在类文件中,在运行时 JVM 将保留注释,因此可以反射性地读取。 RetentionPolicy.SOURCE 编译器要丢弃的注释
- Ducument 说明该注解将被包含在javadoc中,生成Doc文档时使用
- Inherited 声明子类可以继承父类的注解
##04 自定义注解
- 使用@interface自定义注解,将自动继承Annotation接口
- 格式:用@interface声明一个注解,public @interface 注解名{定义内容}
- 定义的内容:返回值类型 方法名();
- 每一个方法实际上是声明了一个配置参数,方法的名称就是参数的名称,返回值类型就是参数的类型(注意:返回值只能是基本类型和Class,String,enum)
- 注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0作为默认值,通过default声明参数的默认值,被default""声明的参数在使用注解时可以不赋值
- 只有一个参数的时候,默认使用value当做参数名字,使用的时候可以省略参数名
自定义注解程序示例
@MyAnnotation1(num=10)//
public class Test2 {
@MyAnnotation1(num=10)
public void test0(){}
@MyAnnotation2("A")
public void test1(){}
}
//元注解写在自定义注解之上注释该自定义注解
@Target(value = {ElementType.TYPE,ElementType.METHOD})//声明作用域为类、接口和方法
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation1{
String name() default"";
//返回值类型 方法名();==参数类型 参数名();
//被default声明的可以不赋值
int num();
}
@Target(value = {ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
String value();
}