文章目录
九、注解(Annotation)
-
注解,也叫注释类型,英文单词是:Annotation
-
注解Annotation是一种引用数据类型,编译之后也是生成xxx.class文件。
-
怎么自定义注释呢?语法格式?
[修饰符列表] @ interface 注解类型名{}
-
注解怎么使用,用在什么地方?
第一:注解使用时的语法格式是:
@注解类型名
第二:注解可以出现在类上、属性上、方法上、变量上等…
注解还可以出现在注解类型上。
1 jdk内置的注解:
java.lang包下的注释类型:
@Deprecated:注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它是危险的,或者因为存在更好的替代方法。 编译器在不被弃用的代码中使用或覆盖不推荐使用的程序元素时发出警告。
这个注解表示:注解标注的元素已经过时
@ Override :表示一个方法声明打算重写超类中的另一个方法声明。
@ SuppressWarnings :表示在注释元素(以及注释元素中包含的所有程序元素)中应该抑制命名的编译器警告。 (不需要掌握)
1.1.Override(检查是否重写父类方法)
- Override这个注解只能注解方法
- Override :表示一个方法声明打算重写超类中的另一个方法声明。
- Override这个注解是给编译器参考的,和运行阶段没有关系。
- 凡是java中的方法带有这个注解的,编译器都会进行编译检查,如果这个方法不是重写父类的方法,编译器报错。
元注解
- 什么是元注解?
用来标注”注解类型“的”注解“,称为元注解
- 常见的元注解有哪些?
Target
Retention
1. 2 Target注解:
这是一个元注解,用来标注”注解类型“的”注解“
这个Target注解用来”被标注的注解“可以出现在哪些位置上。
@Target(ElementType.METHOD):表示”被标注的注解“只能出现在方法上
@Target(Element.Type):表示”被标注的注解“只能出现在类上
@Target(Element.Type,Element.METHOD):表示”被标注的注解“只能出现在方法上
1.3 Retention注解:
这是一个元注解,用来标注”注解类型“的”注解“
这是个Rentention注解用来标注”被注解的注解“最终保存在哪里。
@Retention(RetentionPlicy.SOURCE): 表示该注解只被保留在java源文件中。
@Retention(RetentionPolicy.CLASS): 表示该注解被保存在class文件中。
@Retention(RetentionPolicy.RUNTIME): 表示该注解被保存在class文件中,并且可以被反射机制所读取。
1.4 Deprecated注解
@Deprecated:注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它是危险的,或者因为存在更好的替代方法。 编译器在不被弃用的代码中使用或覆盖不推荐使用的程序元素时发出警告。
这个注解表示:注解标注的元素已经过时
2. 注解中定义属性
在注解中定义属性
注解当中可以定义的属性的类型可以是:byte、short、int、long、float、double、char、String、Class 枚举类型
以及以上每一种的数组形式。
public @interface MyAnnotation {
String name();
int age();
// 设定默认值
int num() default 0;
}
使用注解:
public class AnnotationTest01 {
@MyAnnotation
// 报错的原因:如果一个注解中由属性,那么必须给属性赋值(除非该属性由默认值)
private int no;
// @MyAnnotation(属性名 = 属性值,属性名 = 属性值)
@MyAnnotation(name = "hai",age = 23)
public void doSome(){
}
3. 反射注解
通过反射机制来获取注解
注解:
类:
通过反射机制获取注解的值
注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Myannotation01 {
String username();
String passwords();
}
类:
public class Myanotation01Text {
@Myannotation01(username = "哈哈哈", passwords = "123")
public void dosome() {
}
public static void main(String[] args) throws Exception {
// 获取Myanotation01Text的dosome方法上面的注解信息
Class c = Class.forName("Myanotation01Text");
// 获取dosome方法
Method dosomemethod = c.getDeclaredMethod("dosome");
// 判断方法上是否存在注解
if (dosomemethod.isAnnotationPresent(Myannotation01.class)) {
Myannotation01 myannotation01 = dosomemethod.getAnnotation(Myannotation01.class);
System.out.println(myannotation01.username());
System.out.println(myannotation01.passwords());
}
}
}
4. 注解在开发当中的作用
注解在程序当中等同于一种标记
需求:
定义一个id注解:
User类:
测试类: