zoukankan      html  css  js  c++  java
  • 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、待办


  • 相关阅读:
    把一个数组 赋值给一个新数组
    上传图片时进行压缩
    input上传文件 显示进度条
    vue 后台接口返回文件流地址的下载
    时间戳转换
    JS 两个含有部分相同属性的对象如何快速给对应的key赋值
    javascript中把一个数组的内容全部赋值给另外一个数组
    微信小程序wxs如何使用
    优化内存
    解决position:fiexd相对父元素定位
  • 原文地址:https://www.cnblogs.com/pengguozhen/p/14779573.html
Copyright © 2011-2022 走看看