注解(Annotation):
注解是对程序的注释信息。
一种引用数据类型,编译后的文件是xx.class文件
写法:
修饰符列表 @interface 注解类型名{
}
注解使用:
1.语法格式:@注解类型名
2.注解可以出现在类上,属性上,方法上,变量上等,也可以出现在注解上。默认情况下,注解可以出现在任意位置。
JDK自带注解:
@Override:
标识性注解,给编译器作参考的,表示方法重写了。
源码:
public @interface Override {
}
只能出现在方法上,是给编译器参考的,和运行阶段无关,编译器会检查带有这个注解的方法是否为重写父类的方法。
@Documented:
表示当前方法、类、属性等已过时,有更好的解决方案。
元注解:
用来标注“注解类型”的注解,称为元注解。
@注解1
public @interface m1 {
}
此时注解1称为元注解。
常见的元注解:
1.@Target :
这个注解用来标注,被标注的注解可以出现在哪些地方上。
@Target(ElementType.METHOD):表示被标注的注解只能出现在方法上。
@Target(value={CONSTRUCTOR,字段,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE}):表示被标注的注解能出现在构造方法上、字段上、局部变量上等。
2.@Retention:
这个注解用来标注,被标注的注解最终保存的位置。
@Retention(RetentionPolicy.SOURCE):表示被标注的注解只被保留在java源文件中。
@Retention(RetentionPolicy.CLASS):表示被标注的注解只被保留在class文件中。
@Retention(RetentionPolicy.RUNTIME):表示被标注的注解只被保留在class文件中,并且可以被反射机制所读取。
注解中的属性:
写法:类型 属性名();
在使用注解时,必须在注解后面跟上(属性名=属性值,属性名=属性值…)
例如:
public @interface m1{
String name();
}
@m1(name=“张三”)
public void dosome(){
}
可以在属性后面用default加默认值。
例如:
int age() default 25;//属性指定默认值
在注解中,如果属性的名字为“value”,可以忽略其属性名来赋值。
例如:
public @interface m1(){
String value();
}
可以:
@m1(value=“hello”)
public void dosome(){
}
也可以:
@m1(“hello”)
public void dosome(){
}
属性可以是基本数据类型,String,Class,枚举及他们的数组。
当属性是数组时,在写注解时需要用大括号来写
例如
public @interface m1(){
String[] email();
}
@m1(email={“zhangsan@123.com”, “lisi@123.com”})
public void dosome(){
}
如果数组中只有一个元素,大括号可以省略。
@m1(email=“zhangsan@123.com”)
public void dosome(){
}
枚举的写法类似以上。
反射注解:
-
通过 类名.isAnnotationPresent(注解名.class),返回布尔类型来判断某个类是否有对应名字的注解。也可以是方法.isAnnotationPresent等其他的。
-
通过类名.getAnnotation(注解名.class)去获取这个注解。
-
获取注解当中的属性:直接用 注解.属性名();就可以得到。
注意:反射注解只能反射RUNTIME类型的注解。