乐趣区

关于java:Java-注解

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+ 右击  查看源码发现, 改办法被注解为已淘汰~
    @Deprecated
    public 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

退出移动版