文章目录
一、注解如何定义?怎么用?
注解,或者说叫做注释类型,英文单词是:Annotation
注解Annotation是一种引用数据类型。编译之后也是生成XXX.class
文件。
自定义注解:
[修饰符列表] @interface 注解类型名{
}
注解怎么使用,用在什么地方?
- 第一:注解使用时的语法格式是:
@ 注解类型名
- 第二:注解还可以出现在类上、属性上、方法上、变量上等…注解还可以出现在注解类型上。
JDK内置了哪些注释?
java.lang
包下的注释类型:
- 掌握:
Deprecated
,用@Deprecated
注释的程序元素。不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。 - 掌握:
Override
,表示一个方法声明打算重写超类的另一个方法声明。 - 不用掌握:SuppressWarnings,指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。
二、自定义注解
注解以@开头
在idea中new一个自定义注解
自定义注解的依法格式:
【修饰符列表】 @interface 注解名称{…}
public @interface FirstAnnotation {
}
使用注解:@注解名称 如:@Override
@MyAnnotation
public class Person {
}
三、Override注解
关于JDK lang包下的Override注解
源代码:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Override
只能注解方法。@Override
这个注解是给编译器参考的,和运行阶段没有关系- 凡是java中的方法带有这个注解的,编译器都会进行编译检查,如果这个方法不是重写父类的方法,编译器报错。
四、元注解
1、什么是元注解?
用来标注”注解类型的"注解"。称为元注解
2、常见的元注解有哪些?
- Target
- Retention
3、关于Target注解:
这是一个元注解,用来标注"注解类型”的注解"
这个Target注解用来标注"被标注的注解"可以出现在哪些位置上
@Target (ElementType .METHOD)
:表示w被标注的注解只能出现在方法上.
4、关于Retention注解:
这是一个元注解,用来标注"注解类型”的"注解"
这个Retention
注解用来标注"被标注的注解"最终保存在哪里。
@Retention(RetentionPolicy .SOURCE)
:表示该注解只被保留在java源文件中。@Retention(RetentionPolicy.CLASS)
:表示该注解被保存在class文件中
@Retention(RetentionPolicy.RUNTIME)
:表示该注解被保存在class文件中,并且可以
五、Deprecated注解
表示已过时的。
源码:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
六、使用反射获取注解信息
需求:创建一个自定义注解,在Person类上及Person的方法上使用注解,在测试类中通过反射获取标注在Person类和方法上的注解信息。
注意:自定义注解必须用@Retention(RetentionPolicy.RUNTIME)标注,这样自定义注解才能被反射机制读取到。
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonInfo {
int age();
String name();
}
@PersonInfo(age=20,name="张三")
public class Person {
@PersonInfo(age=30,name="李四")
public void eat(){
System.out.println("run方法执行了.....");
}
}
测试类:
import java.lang.reflect.Method;
public class ReflectPersonInfo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
//获取Person类对象
Class<?> aClass = Class.forName("cn.itcast.annotation.Person");
//获取标注在Person类上的@PersonInfo注解信息
if(aClass.isAnnotationPresent(PersonInfo.class)){ //判断Person类上是否有@PersonInfo注解标注
//获取注解对象
PersonInfo personInfo = aClass.getAnnotation(PersonInfo.class);
//打印标注在Person类上的@PersonInfo注解信息
System.out.println(personInfo.age());
System.out.println(personInfo.name());
}
System.out.println("----------------------------");
//获取标注在Person类的方法上的@Person注解信息
Method eat = aClass.getDeclaredMethod("eat"); //获取Person类的eat方法对象
if(eat.isAnnotationPresent(PersonInfo.class)){ //判断Person类的eat方法上是否有@PersonInfo注解标注
//获取标注在eat方法上的注解对象
PersonInfo personInfo = eat.getAnnotation(PersonInfo.class);
//打印标注在Person类中的eat()方法上的注解信息
System.out.println(personInfo.name());
System.out.println(personInfo.age());
}
}
}
测试结果: