java干货,请记得收藏!!!

java干货,铁子双击关注666#JAVA学习#

1、概念

Java 注解(Annotation)又称 Java 标注。 Java 语言中的类、方法、变量、参数和包等都可以被标注。 Java 注解可以通过反射获取标注内容。 在编译器生成类文件时,注解可以被嵌入到字节码中,在运行时可以获取到标注内容 。

1.1 简单的使用

1.1.1 声明一个注解

//指定该注解的保留策略:运行时保留

@Retention(RetentionPolicy.RUNTIME)

//指定该注解的标注位置:类、字段、方法

@Target(value={ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})

public @interface MyAnnotation{

//属性

String value();

int age() default 20;

}

复制代码

1.1.2 标注位置

注解可以标注在类、方法、字段等元素上。

@MyAnnotation(value="我在类上",age=10)

public class Main{

@MyAnnotation("我在字段上")

private int filed;

@MyAnnotation("我在方法上")

public void method(){

}

}

复制代码

1.1.3 获取注解

通过反射获取注解(Class,Method,Filed)。

//获取类上所有注解

Annotation[] anns = Main.class.getAnnotations();

//获取类上指定注解

MyAnnotation ann = Main.class.getAnnotation(MyAnnotation.class);

//获取字段指定注解

ann = Main.class.getField("filed").getAnnotation(MyAnnotation.class);

//获取方法指定注解

ann = Main.class.getMethod("method").getAnnotation(MyAnnotation.class);

System.out.println(ann.value()+":"+ann.age());

复制代码

1.2 注解的本质

对注解类进行反汇编,可以发现注解的本质是继承java.lang.annotation.Annotation的一个接口。

public interface MyAnnotation extends Annotation{

//属性

}

复制代码

1.2.1 Annotation接口

public interface Annotation {

//判断两个注解实例是否相同

boolean equals(Object obj);

//返回此注解的哈希码

int hashCode();

//返回此注解的字符串表示形式

String toString();

//返回此注解的注解类型

Class annotationType();

}

复制代码

1.3 注解的“属性”

注解的“属性”就是注解接口类中的方法,例如上面MyAnnotation注解中的value、age都被成为属性,其本质是一个get方法。

1.3.1 类型限定

注解属性的返回值类型只允许以下几种:

基本数据类型

String

枚举

注解

以上类型的数组

1.3.2 默认值

定义属性时,可以使用default关键字给属性默认初始化值。在使用注解时,对有默认值的属性可以不赋值。

例如:

public @interface MyAnnotation{

int value();

}

复制代码

1.3.3 省略value

如果只有一个属性需要赋值,并且属性的名称叫value,那么使用时可以省略value,直接定义值即可。

例如:

public @interface MyAnnotation{

int value();

}

复制代码

之后使用注解时可以直接使用@MyAnnotation,而无需使用@MyAnnotation(value=20)

1.3.4 数组赋值

public @interface MyAnnotation{

int[] value();

}

复制代码

数组赋值时,值使用{}包裹,若数组中只有一个元素,则{}可以省略。

例如:@MyAnnotation({1,2,3}),@MyAnnotation

2、常用相关注解

2.1 元注解

元注解是用于标注注解的注解。

2.1.1 @Documented

@Documented注解表明这个注解是由 javadoc记录的。

如果一个类型声明被注解了文档化,它的注解成为公共API的一部分。

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)

public @interface Documented {

}

复制代码

例如:@Documented

2.1.2 @Retention

@Retention作用是定义被它所注解的注解保留多久

一共有三种策略,定义在RetentionPolicy枚举中。

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)

public @interface Retention {

/**

* Returns the retention policy.

* @return the retention policy

*/

RetentionPolicy value();

}

复制代码

例如:@Retention(RetentionPolicy.RUNTIME)

2.1.2.1 RetentionPolicy枚举

public enum RetentionPolicy {

/**

* 注解只在源代码级别保留,编译时被忽略

*/

SOURCE,

/**

* 注解将被编译器在类文件中记录

* 但在运行时不需要JVM保留。

*/

CLASS,

/**

* 注解将被编译器记录在类文件中

* 在运行时保留VM,因此可以反读。

* @see java.lang.reflect.AnnotatedElement

*/

RUNTIME

}

复制代码

2.1.3 Target

@Target描述了注解的使用范围

具体元素范围在ElementType枚举中。

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)

public @interface Target {

ElementType[] value();

}

复制代码

例如:

@Target(ElementType.ANNOTATION_TYPE)

@Target(value={ElementType.ANNOTATION_TYPE,ElementType.FIELD})

复制代码

2.1.3.1 ElementType枚举

public enum ElementType {

/** 类, 接口(注解), 或枚举声明 */

TYPE,

/** 字段声明(包括枚举常量) */

FIELD,

/** 方法声明(Method declaration) */

METHOD,

/** 参数声明 */

PARAMETER,

/** 构造函数声明 */

CONSTRUCTOR,

/** 局部变量声明 */

LOCAL_VARIABLE,

/** 注解类型声明 */

ANNOTATION_TYPE,

/** 包声明 */

PACKAGE,

/**

* 类型参数声明

* @since 1.8

*/

TYPE_PARAMETER,

/**

* 使用的类型

* @since 1.8

*/

TYPE_USE

}

复制代码

2.1.4 Inherited

描述注解是否被子类继承。

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)

public @interface Inherited {

}

复制代码

2.2、 JDk内置注解

2.2.1 Override

监测被该注解标注的方法是否是继承自父类的

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.SOURCE)

public @interface Override {

}

复制代码

2.2.2 Deprecated

表示已过时,编辑器会出现删除线提示。例如:new Date().getYear();

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})

public @interface Deprecated {

}

复制代码

2.2.3 SuppressWarnings

压制警告,忽略警告

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})

@Retention(RetentionPolicy.SOURCE)

public @interface SuppressWarnings {

String[] value();

}

复制代码

例如:@SuppressWarnings("unchecked")

3、如何获取注解

可以通过Java反射来获取注解(Class,Method,Filed)。

//获取类上所有注解

Annotation[] anns = Main.class.getAnnotations();

//获取类上指定注解

MyAnnotation ann = Main.class.getAnnotation(MyAnnotation.class);

//获取字段指定注解

ann = Main.class.getField("filed").getAnnotation(MyAnnotation.class);

//获取方法指定注解

ann = Main.class.getMethod("method").getAnnotation(MyAnnotation.class);

System.out.println(ann.value()+":"+ann.age());

复制代码

除了这篇文章整理的关于Java注解的学习资料,我还整理了更多的Java学习资料,多家互联网大厂和多位大佬的面经资料,还有更多的面试技巧。有需要的朋友可以点击进入获取。暗号:掘金。

4、小结

(1)大多数时候,我们会使用注解,而不是自己定义注解,大部分框架都使用注解,例如:SpringBoot、Lombok。

(2)合理使用注解可以节省代码量,使逻辑更清晰。

5、写在最后

水平所限,本文整理的“Java注解解析”也许存在不足之处或者可补充之处。如果有大佬发现了本文存在的问题,请不吝赐教。

如果这篇文章对你有帮助,别忘了点赞,收藏,分享(一健三连哟~)。这对我真的很重要。谢谢各位的观看!

希望大家都能不断学习,成为更好的自己!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容