注解
概念
1.Annotation 注解/注释
2.注解Annotation是一种引用数据类型
。编译之后也是生成xxx.class文件。
3.自定义注解语法格式:
[修饰符列表] @interface 注解类型名{
}
4.注解的使用:
第一:注解使用时的语法格式是: @注解类型名
第二:注解可以出现在类上、属性上、方法上、变量上等…
注解还可以出现在注解类型上。
5.JDK内置注解:
掌握:Deprecated
用 @Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。
掌握:Override
表示一个方法声明打算重写超类中的另一个方法声明。
了解:SuppressWarnings 指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。
6.元注解
用来标注“注解类型”的“注解”,称为元注解。
常见的元注解:
Target
Retention
关于Target注解
:
Target注解用来标注“被标注的注解”可以出现在哪些位置上。
@Target(ElementType.METHOD):表示“被标注的注解”只能出现在方法上。
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
表示该注解可以出现在:构造方法上,字段上,局部变量上,方法上,...,类上
关于Retention注解
:
Retention注解用来标注“被标注的注解”最终保存在哪里。
@Retention(RetentionPolicy.SOURCE):表示该注解只被保留在java源文件中。
@Retention(RetentionPolicy.CLASS):表示该注解被保存在class文件中。
@Retention(RetentionPolicy.RUNTIME):表示该注解被保存在class文件中,并且可以被反射机制所读取。
Retention 源代码:
// 元注解
public @interface Retention {
//属性
RetentionPolicy value();
}
RetentionPolicy的源代码:
public enum RetentionPolicy {
SOURCE,
CLASS,
RUNTIME
}
Override 源代码
:
@Target(ElementType.METHOD) //元注解,指定“被标注的注解”只能出现在方法上
@Retention(RetentionPolicy.SOURCE) //元注解,指定该注解只被保留在java源文件中
public @interface Override {
}
// 这个注解只能注释方法,这个方法必须是重写父类的方法
// 这个注解是给编译器参考的,和运行阶段没有关系
// 凡是java中的方法带有这个注解的,编译器都会进行编译检查,如果这个方法不是重写父类的方法,编译器报错
8.Deprecated 源代码
:
@Documented
@Retention(RetentionPolicy.RUNTIME) //元注解,表示该注解被保存在class文件中,并且可以被反射机制所读取
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
// 这个注解注释的方法表示已过时的,调用这个注解注释的方法会出现横线
注意:
- 如果一个注解当中有属性,那么必须给属性赋值(除非该属性使用default指定了默认值)
- 如果一个注解的属性的名字是value的话,在使用的时候,该属性名可以省略。属性名是其它的时候不能省略。
9.注解当中的属性类型:
byte
short
int
long
float
double
boolean
char
String
Class
枚举类型
以及以上每一种的数组形式
通过反射机制获取注解
MyAnnotation.java
@Target({ElementType.METHOD,ElementType.TYPE}) // 只能用在方法和类上
@Retention(RetentionPolicy.RUNTIME) //表示该注解被保存在class文件中,并且可以被反射机制所读取
public @interface MyAnnotation {
// value属性
String value() default "lwx";
}
AnnotationTest.java
@MyAnnotation
public class AnnotationTest {
@Override
public String toString() {
return super.toString();
}
@Deprecated
public void asd() {
}
@MyAnnotation("asd")
public void doSome() {
}
}
AnnotationTest01.java
/*
通过反射机制获取注解
*/
public class AnnotationTest01 {
public static void main(String[] args) throws Exception {
// 获取这个类
Class c = Class.forName("com.hk.javase.AnnotationTest");
// 判断类上面是否有@MyAnnotation
//System.out.println(c.isAnnotationPresent(MyAnnotation.class)); //true
if (c.isAnnotationPresent(MyAnnotation.class)) {
// 获取该注解对象
MyAnnotation myAnnotation = (MyAnnotation) c.getAnnotation(MyAnnotation.class);
System.out.println("类上面的注解对象:" + myAnnotation);
// 获取该注解上的属性的值
String value = myAnnotation.value();
System.out.println(value);
}
// 获取doSome()方法
Method doSome = c.getDeclaredMethod("doSome");
// 判断方法上面是否有@MyAnnotation
if (doSome.isAnnotationPresent(MyAnnotation.class)) {
// 获取该注解对象
MyAnnotation annotation = doSome.getAnnotation(MyAnnotation.class);
System.out.println("方法上的注解对象:" + annotation);
// 获取该注解上的属性的值
String value = annotation.value();
System.out.println(value);
}
}
}
运行结果:
类上面的注解对象:@com.hk.javase.MyAnnotation(value=lwx)
lwx
方法上的注解对象:@com.hk.javase.MyAnnotation(value=asd)
asd