Java注解

  • 本文参照学习:

    感激大佬~

  • 集体源码地址:https://gitee.com/WSM540

注解

前言:

框架等于:注解 + 反射 + 设计模式~

JDK 5.0 开始, Java 减少了对元数据的反对, 也就是 Annotation(注解) 安闹太湿~

Annotation 其实就是代码里的 非凡标记, 这些标记能够在编译, 类加 载, 运行时被读取, 并执行相应的解决

  • 通过:注解 + 反射

    反射扫描对应类的注解,以及注解下面的参数,给类的增加一些通用的操作~

  • 开发者,能够:

    不扭转原有逻辑的状况下, 在源文件中嵌入一些补充信息

    代码剖析工具、开发工具和部署工具:能够通过这些补充信息进行验证或者进行部署。

Annotation 能够像修饰符一样被应用:

  • 用于润饰包,类, 结构器, 方 法, 成员变量, 参数, 局部变量的申明

为什么要援用注解:

应用【注解】之前:

  • xml 是被宽泛的利用于形容元数据它以松耦合的形式实现了框架中简直所有的配置

    然而随着我的项目越来越宏大: XML 的内容也越来越简单,一些利用开发人员和架构师发现保护老本变高。

  • 人门跟心愿呈现一些和代码 紧耦合的形式~

    能够更加清晰的理解类的申明~

  • 于是就有人提出来一种标记式高耦合的配置形式 注解:

    办法上能够进行注解,类上也能够注解,字段属性上也能够注解,反正简直须要配置的中央都能够进行注解. 对象代码进行申明治理;

注解须要配合反射一起应用~

Java常见的 Annotation 实例:

@Override

  • 限定重写父类办法, 该注解只能用于办法 属于一种标记注解
  • //1. 定义一个接口interface Info{    void show();}//2. 创立一个类,实现接口 info 实现办法~class Student implements Info{    //个别工具都会主动加一个注解,     //    示意: 改办法是实现接口的重写办法(); 当然不加也没啥事件,只是一个程序提醒~    @Override    public void show() {   }}

    @Deprecated

  • 用于示意所润饰的元素(类, 办法等)已过期,通常是因为 所润饰的构造危险或存在更好的抉择
  • Date date = new Date(2000,9,9); //这段代码并不会报错:创立一个日期对象 2000-09-09 日期对象;//    但 new Date(); 办法上会有一个 删除线, 提醒改办法以及淘汰~//ctrl+右击  查看源码发现,改办法被注解为已淘汰~@Deprecatedpublic Date(int year, int month, int date) {    this(year, month, date, 0, 0, 0);}
  • 这样申明并不是示意,办法不能应用而是不倡议 曾经有更好的办法了

    JDK是向下兼容的,不然每次更新一些老我的项目如果不合乎就会出错,就不好了~

  • 场景:

    如果你的我的项目中有一个,你写的办法,忽然一个大佬也写了一个更好的,你又不想删除已经的办法

    都是手敲的多少有点舍不得 能够应用该 注解 ,标记一下办法~ 已淘汰

@SuppressWarnings

  • 克制编译器正告
  • 当我门定义对象,没有被应用的时候, 编辑器会呈现 正告 能够应用该注解屏蔽正告⚠

应用注解后面要加 @符号 当作一个修饰符应用,申明在类 办法 属性上!

自定义注解:

目前除了, JDK自带的注解,很多的框架也提供了很多的注解:

  • Spring JPA Hibernate 很多框架都提供很多注解,实现基于注解开发~
  • 自定义注解,并不常见但能够理解...

    自定义注解必须配上注解的信息处理流程才有意义 如果没有解析它的代码,它可能连正文都不如

实现:

  • 定义新的 Annotation 类型应用 @interface 关键字
  • 自定义注解主动继承了:Java.lang.annotation.Annotation接口
  • Annotation 的成员变量

    以无参数办法的模式来申明

    其:办法名和返回值 对应 该成员的 ==名字==和==类型==

  • 类型只能是:

    八种根本数据,String,Class,enum,Annotation

MyAnnotation

Idea 工具创立 Annotation 注解类:

MyAnnotation

/** 自定义注解1.0 */@Retention(RetentionPolicy.RUNTIME)                    //一种元注解: 标识注解的执行生命周期 (什么时候被执行!)public @interface MyAnnotation {    //这是自定义注解中,属性的申明形式: 数据类型 参数名;//    String value();    //指定成员变量的初始值可应用 default 关键字    String value() default "wsm";                   /** 如果只有一个参数成员,倡议应用参数名为value */}

TestAnnotation.Java

package com.wsm.anotation;import java.lang.annotation.Annotation;/** 步骤2 */public class TestAnnotation {    public static void main(String[] args) {        //应用反射,来实现注解是实习,这里只是简略的输入.        //  很多时候反射,扫描所有的类,并判断注解的参数 欠缺类添新的性能~        Class clazz = Wsm.class;        Annotation[] annotations = clazz.getAnnotations();      //获取以后类的注解汇合~        for(int i = 0;i < annotations.length;i++){              //输入注解汇合的值!            System.out.println(annotations[i]);        }    }}/** 步骤1 *///@MyAnnotation                     //啥也不写默认值~//@MyAnnotation(value = "abc")      //手动填写@MyAnnotation("efg")              //如果注解的只有一个属性且属性名是 value: 能够省略不写class Wsm{    //一个空的类,应用 自定义注解~    @MyAnnotation    public void show(){        System.out.println("show办法()");    }}
  • ok,这就是一个最根本是 自定义注解的应用~
  • 别忘了自定义注解要加上 @Retention(RetentionPolicy.RUNTIME) 不然类加载时候,扫描不到;

    @Retention 是什么?

    @Retention是一种元注解

元注解Meta-Annotation

什么是元注解:

Java5.0定义了4个规范的 Meta-Annotation类型 继承了:Java.lang.annotation.Annotation接口

元注解的作用就是负责注解其余注解: 它们被用来提供对其它 注解类型作阐明; 润饰注解的注解

JDK 中的元注解 4:

@Retention

  • 用于润饰一个 Annotation 定义, 用于指定该 Annotation 的生命 周期

    @Rentention 蕴含一个 RetentionPolicy 类型的成员变量enum类型 @Rentention 蕴含一个 RetentionPolicy 类型的成员变量

  • RetentionPolicy枚举

    **RetentionPolicy.SOURCE**- **注解只在源码阶段保留,在编译器进行编译时它将被抛弃漠视****RetentionPolicy.CLASS**- **当运行Java 程序时, JVM不会保留注解,这是`默认值`**- **实例:** `@Override、@Deprecated、@SuppressWarnning`**RetentionPolicy.RUNTIME**- **当运行 Java 程序时, JVM 会保留正文,`程序能够通过反射获取该正文`**- **实例:** `@Controller、@Autowired、@RequestMapping`- `自定义注解,想要被扫描到,须要增加改注解 @Retention(RetentionPolicy.RUNTIME)`

@Target

  • 用于润饰 Annotation 定义, 指定被润饰的 Annotation 能用于 润饰哪些程序元素 默认值:为任何元素

    即:注解能够润饰的元素:类 属性 泛型 enum枚举 办法()...

  • JDK5.0

    顾名思义,这个元注解必定是和文档无关。它的作用是可能将注解中的元素蕴含到 Javadoc 中去ElementType.ANNOTATION_TYPE 能够给一个注解进行注解ElementType.CONSTRUCTOR     能够给构造方法进行注解ElementType.FIELD             能够给属性进行注解ElementType.LOCAL_VARIABLE     能够给局部变量进行注解ElementType.METHOD             能够给办法进行注解ElementType.PACKAGE         能够给一个包进行注解ElementType.PARAMETER         能够给一个办法内的参数进行注解ElementType.TYPE             能够给一个类型进行注解,比方类、接口、枚举
  • JDK8.0顾名思义,这个元注解必定是和文档无关。它的作用是可能将注解中的元素蕴含到 Javadoc 中去

    ElementType.TYPE_PARAMETER    能够给一个泛型进行注解ElementType.TYPE_USE         示意该注解能写在应用类型的任何语句中 `申明了改类型就不必在申明其它形式了.`

@Documented

  • 顾名思义,这个元注解必定是和文档无关。它的作用是可能将注解中的元素蕴含到 Javadoc 中去
  • 定义为Documented的注解必须设置Retention值为RUNTIME

@Inherited

  • @Inherited 元注解是一个标记注解被标注的类型是被继承的
  • A类 应用了带有 @Inherited的注解,B类 继承 A类,B也会领有A的注解~

JDK8.0 新增元注解

@Repeatable

  • 可反复注解 有时候,须要注解在类上屡次申明应用能够应用改注解.

JDK8.0 可反复注解应用:

定义可反复的注解容器注解

MyAnnotations

import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)public @interface MyAnnotations {    MyAnnotation[] value();             //注解属性,是可反复注解的数组~}

MyAnnotation

import java.lang.annotation.Repeatable;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)@Repeatable(MyAnnotations.class)           //1.8新增可反复注解,晓得注解容器~public @interface MyAnnotation {    String value();                         //参数~}

TestAnnotation.java

import java.lang.annotation.Annotation;/** 步骤2 */public class TestAnnotation {    public static void main(String[] args) {        //应用反射,来实现注解是实习,这里只是简略的输入.        //  很多时候反射,扫描所有的类,并判断注解的参数 欠缺类添新的性能~        Class clazz = Wsm.class;        Annotation[] annotations = clazz.getAnnotations();      //获取以后类的注解汇合~        for(int i = 0;i < annotations.length;i++){              //输入注解汇合的值!            System.out.println(annotations[i]);        }    }}/** 步骤1 */@MyAnnotation("abc")        //可反复注解,能够一次增加多个属性!@MyAnnotation("efg")class Wsm{    //一个空的类,应用 自定义注解~    public void show(){        System.out.println("show办法()");    }}

运行后果:

@com.wsm.annotation2.MyAnnotations(value[@com.wsm.annotation2.MyAnnotation(value=abc),@com.wsm.annotation2.MyAnnotation(value=efg)])

输入了多个注解的 value