Java注解概述
Annotation是JDK5.0开始引进的技术
Annotation的作用:
- 不是程序本身,可以对程序做出解释
- 可以被其他程序读取(比如编译器)
Annotation的格式:
- 是以@+注解名在程序中存在的,还可以添加一些参数例如@SupperssWarning(value = “unchecked”)
Annotation在哪里使用:
- 可以附加在packge,class,method,field上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问
内置注解
- @Override:表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。
- @Deprecated:表示不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。
- @SuppressWarnings:指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。注意,在给定元素中取消显示的警告集是所有包含元素中取消显示的警告的超集。例如,如果注释一个类来取消显示某个警告,同时注释一个方法来取消显示另一个警告,那么将在此方法中同时取消显示这两个警告。
元注解
负责注解其他注解的注解
Java中定义了四个元注解(meta-annotation)
- @Target:用于描述注解的使用范围
- @Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期
- (SOURCE<CLASS<RUNTIME)
- @Documented:表示该注解将被包含在javadoc中
- @Inherited:表示子类可以继承父类中的该注解
自定义注解
格式:
public @interface 注解名{ 参数类型 参数名()[default 参数]; }
注意:自定义注解需要使用元注解进行注释,至少要使用@Target和@Retention,指明可以放的位置,生效的位置
使用@interface自定义注解的时候,默认继承了java.lang.annotation.Annotation接口
分析:
- @interface定义一个注解,默认格式为public @interface 注解名{定义内容}
- 其中的每一个方法实际上是声明了一个配置参数,方法名称就是参数命名,方法返回值类型,就是参数类型(返回值类型只能是基本类型、String、枚举类型、Class)
- 可以通过default来声明参数默认值
- 当只有一个参数的时候,这个时候参数名称一般声明为value,这时,使用注解的时候,可以直接写参数值,不需要写参数名。
- 注解元素必须要有值,我们一般使用空字符串或者0来作为默认值,如果没有默认值,使用注解的时候必须给予参数值。
public class Demo02 {
//没有默认值的参数必须写,有默认值的参数可以不写,参数名不是value则必须写明参数名
@MyAnnotation1(id = 13246)
public void say(){}
//参数名是value时,且只有一个参数时,可以不写参数名,直接写参数,这是一种默认约束
@MyAnnotation2("你好")
public void talk(){}
}
//定义注解可以放的位置
@Target({ElementType.TYPE,ElementType.METHOD})
//定义注解有效的情况,RUNTIME表示运行时,CLASS表示class文件,SOURCE表示源代码
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation1{
//定义参数 参数类型+参数名称();
//定义参数 参数类型+参数名称() default 参数;
String name() default "戴";//参数可以取默认值
int age() default 10;
int id();
ElementType em() default ElementType.METHOD;
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
String[] value();
}