文章目录
1.常用注解
1.1@override
标记方法是否重写父类的方法,不是方法重写则报错
1.2@Deprecated
若某类或某方法加上
@Deprecated
注解之后,表示此方法或类不再建议使用,调用时也会出现删除线,但并不代表不能用,只是说,不推荐使用,因为还有更好的方法可以调用
1.2.1为什么需要标记而不删除不建议方法
- 因为在一个项目中,工程比较大,代码比较多,而在后续开发过程中,可能之前的某个方法实现的并不是很合理,这个时候就要新加一个方法,而之前的方法又不能随便删除,因为可能在别的地方有调用它,所以加上这个注解,就方便以后开发人员的方法调用了。
1.3@SuppressWarnings
取消显示指定的编译器警告
1.4@FunctionalInterface
标记函数式接口:在
JDK1.8
新增的注解,规定一个接口只能有一个抽象方法
2.自定义注解
注解的主要组成:
Annotation.java
ElementType.java
RetentionPolicy.java
这三个类
2.1@Retention
注解的生命周期
说明 | |
---|---|
CLASS | 编译器将把注释记录在类文件中,但在运行时 JVM 不保留注释 |
RUNTIME | 编译器将把注释记录在类文件中,在运行时 JVM将保留注释,因此可以反射性地读取 |
SOURCE | 编译器要丢弃的注释 |
@Retention(RetentionPolicy.RUNTIME)
2.2@Target
注解的使用范围
说明 | |
---|---|
ANNOTATION_TYPE | 注释类型声明 |
CONSTRUCTOR | 构造方法声明 |
FIELD | 字段声明(包括枚举常量) |
LOCAL_VARIABLE | 局部变量声明 |
METHOD | 方法声明 |
PACKAGE | 包声明 |
PARAMETER | 参数声明 |
TYPE | 类、接口(包括注释类型)或枚举声明 |
@Target({ElementType.FIELD,ElementType.METHOD})
2.3注解格式
@interface:注解的定义
public @interface 注解名称{
// 属性
}
2.4Demo:注解作用于方法上
- 自定义注解MyAnnotion
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) // 注解的生命周期
//多个使用范围时,需要添加{} (e.g. : ({a, b})
@Target({ElementType.FIELD,ElementType.METHOD}) // 注解的使用范围
public @interface MyAnnotion {
// 添加属性 数据类型 属性名称();
// 可以把注解 使用类 或者方法 或者 属性上面 通过反射拿到注解信息
String value();
}
- 使用注解创建Person类
public class Person {
//使用注解给属性使用
@MyAnnotion02(value = "马化腾")
private String name;
@MyAnnotion02(value = "企鹅说:你这个充钱就可以解决")
private String info;
@Override
public String toString() {
return "Person [name=" + name + ", info=" + info + "]";
}
//通过反射可以把注解值赋值 给(属性)对象
}
- 获取注解信息,把注解信息的值通过反射赋值给对象
import java.lang.reflect.Field;
public class Demo04 {
public static void main(String[] args) throws Exception {
// 获取注解信息,把注解信息的值通过反射赋值给对象
// 1.拿到对象的class对象
Class<Person> clazz = (Class<Person>) Class.forName("cn.szsxt.demo02.Person");
Person p = clazz.newInstance();
// 2. 通过反射拿到属性
Field[] fs = clazz.getDeclaredFields();
// 3.拿到注解
for (Field f : fs) {
// 先判断f是否有注解
// 判断属性是否有MyAnnotion02注解
//isAnnotationPresent()判断是否有注解
if (f.isAnnotationPresent(MyAnnotion02.class)) {
// 通过属性使用方法:getAnnotation()获取注解
MyAnnotion02 annotation = f.getAnnotation(MyAnnotion02.class);
// 4.获取注解值
String value = annotation.value();
System.out.println("注解值:" +value);
// 跳过安全检测(暴力破解)
f.setAccessible(true);
// 5.通过反射把注解值赋值给属性
f.set(p, value);
}
}
System.out.println(p);
}
}
注解 & 注释 的区别
注解Annotation | 注释 | |
---|---|---|
定义 | JDK5.0引入的特性 与类、接口、枚举是在同一个层次 注解是源代码的元数据 它是一种描述数据的数据 | 对源代码作介绍、评议或说明的文字 |
作用 | 用于反馈信息给JVM 标记包、类、字段、方法、局部变量、方法参数等元素据 | 反馈信息给人看 告诉开发者这段代码的逻辑、说明、特点等内容 对代码起到解释、说明的作用 |
使用范围 | 参与代码编译,以@开头的,与工具一起使用。 对于位置、语法、内容有一定的限制 | 随意在任务位置填写内容,对代码任何没有影响 |
运行过程 | JVM读取,并进行相应操作,反馈被标元素的注解 | JVM忽略 |