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、实现实体类某些属性不自动赋值。


4、待办


posted @ 2021-05-18 09:25  星命定轨  阅读(46)  评论(0编辑  收藏  举报