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