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