9-1、注解
1、注解的概念及作用
-
1、注解的概念
从 JDK 5.0 开始, Java 增加了对元数据(MetaData) 的支持, 也就是 Annotation(注释)Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理. 通过使用 Annotation, 程序员可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息。
Annotation 可以像修饰符一样被使用, 可用于修饰包,类, 构造器, 方法, 成员变量, 参数, 局部变量的声明, 这些信息被保存在 Annotation 的 “name=value” 对中。
Annotation 能被用来为程序元素(类, 方法, 成员变量等) 设置元数据。
-
2、注解的作用
- 1、生成文档。这是最常见的,也是Java 最早提供的注解。常用的有@see @param @return 等。
- 2、跟踪代码依赖性,实现替代配置文件功能。后面框架的学习中大多都使用注解来减少配置。以后java的程序开发,最多的也将实现注解配置,具有很大用处。
- 3、在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
-
3、结论
java想给程序元素提供元数据支持,于是创造了Annotation来实现这个目标。
2、JDK 内置注解和自定义注解的使用
- 1、JDK 内置注解
- @Override: 用于修饰此方法覆盖了父类的方法。
- @Deprecated: 用于表示某个程序元素(类, 方法等)已过时。
- @SuppressWarnings: 抑制编译器警告、黄色的感叹号。
- 2、如何自定义注解?元注解的使用?
/**
*
* @Description: TODO:自定义注解
* @author pengguozhen
* @date 2018年2月26日 上午8:46:49
*/
/*
* 自定义注解
* 1、@interface 关键字可以自定义注解,
* 2、Annotation 的成员变量在 Annotation 定义中以无参数方法的形式来声明.其方法名和返回值定义了该成员的名字和类型.
* 3、可以在定义 Annotation 的成员变量时为其指定初始值, 指定成员变量的初始值可使用 default 关键字 。
* 4、没有成员定义的 Annotation 称为标记; 包含成员变量的 Annotation 称为元数据 Annotation。
*
* 元注解
* 1、元注解负责注解其他注解(例 自定义注解) ,注解的注解。
* 2、元注解介绍
*
* @Target 说明了注解所修饰的对象范围,即用于描述注解所得使用范围。
* {TYPE,FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}
* 类、成员变量、成员方法、形参、构造器、本地变量等。
*
* The annotation @MyAnnotation is disallowed for this location 该错误表示 注解使用的位置不正确
* 与元注解上 的以上取值有关系。
* @Retention 保持保留:定义了该注解保留时间的长短。注解的级别
* 1、指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,
* 则保留策略默认为 RetentionPolicy.CLASS。
* 2、有三种取值(代表三个阶段):
* RetentionPolicy.SOURCE:保留注解到java源文件阶段,例如Override、SuppressWarnings。
* RetentionPolicy.CLASS:保留注解到class文件阶段,例如 编译后的 class 文件。
* RetentionPolicy.RUNTIME:保留注解到运行时阶段即内存中的字节码,例如Deprecated。
* @Document 用于描述其他类型的注解应该被作为被标注的程序成员的公共API。是一个标记注解没有成员。
*
* @Inherit
*/
@Target({ElementType.FIELD, ElementType.METHOD,ElementType.TYPE,ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "hello";//定义成员变量,初始化赋值。
}
测试自定义注解以及 JDK 内置注解的使用
package annotation;
import java.util.ArrayList;
import java.util.List;
/**
* 测试自定义注解类以及JDK内置注解的使用
*
* @Description: TODO:
* @author pengguozhen
* @date 2018年2月24日 下午4:37:32
*/
public class TestAnnotation {
public static void main(String[] args) {
Person p = new Student();
p.walk();
p.eat();
@SuppressWarnings({ "rawtypes", "unused" })
List list = new ArrayList();
@SuppressWarnings("unused")
int i = 10;
// System.out.println(i);
}
}
@MyAnnotation(value = "atguigu") // 使用自定义注解
class Student extends Person {
@Override
public void walk() {
System.out.println("学生走路");
}
@Override
public void eat() {
System.out.println("学生吃饭");
}
}
class Person {
String name;
int age;
public Person() {
super();
}
@MyAnnotation(value = "atguigu")
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@MyAnnotation(value = "atguigu")
public void walk() {
System.out.println("走路");
}
@Deprecated
public void eat() {//该注解 表示该方法已过时。
System.out.println("吃饭");
}
@Override
public String toString() {//该注解 表示该方法为 重写方法。
return "Person [name=" + name + ", age=" + age + "]";
}
}
3、注解的应用实例
注解+反射 开发小框架
-
1、验证对象属性的完整性。
-
2、实现实体类某些属性不自动赋值。