文章目录

  • Java注解
    • 1.注解的定义
    • 2.元注解
      • 2.1 @Retention(保留)
      • 2.2 @Documented(文档)
      • 2.3 @Target(目标)
      • 2.4 @Inherited(继承)
      • 2.5 @Repeatable(可重复)
    • 3.注解的属性
      • 3.1 使用
        • 一般使用
        • 单个参数传递
        • 无参数传递
      • 3.2 定义
    • 4.注解的获取(反射)
      • 4.1 获取类上注解对象
      • 4.2 类、方法上注解对象
    • 5.注解的使用需求
    • 6.Java预设的注解

分享一篇 【Java注解+Java反射+Java类加载机制+javaweb 技术搭建MVC框架并用于项目】,更加深入的学习和配置使用所学知识点。


Java注解

Annotation,注解,对于Java基础不扎实的我,只会用而不知道其中的原理,今天让我好好了解一下你。

注解就如我们日常生活中看到的标签,去超时看见商品标签,去服装店看到服装标签。它用来标注类或属性。

1.注解的定义

注解通过 @interface 关键字进行定义,下面创建一个TestAnnotation注解类:

public @interface TestAnnotation {}

@interface就相当于接口,不过前面多了一个@符号。而此注解,就可以用到类上了。

2.元注解

元注解是一种基本注解,用于定义注解,常在自定义注解的时候使用。它可定义注解的各种属性,元注解有5种:@Retention、@Documented、@Target、@Inherited和@Repeatable

2.1 @Retention(保留)

Retention意为 保留,解释这个注解的保留的时间(存活的时间)。它的取值由RetentionPolicy类提供

Java代码保留(存活)的时间段分为source -> class -> runtime三个。

  • RetentionPolicy.SOURCE:注解只在源码阶段保留,将被编译器丢弃。
  • RetentionPolicy.CLASS:默认行为,注解只被保留到编译进行的时候,不会被加载到 JVM 中。
  • RetentionPolicy.RUNTIME:注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,程序运行时可读取,可被反射读取到。

2.2 @Documented(文档)

Documented意为 文档,解释此注解中的元素在 Javadoc 中去。【点击我查看javadoc解释】

2.3 @Target(目标)

Target意为 目标,指定定义的注解起作用的场景。限定注解的使用场景、使用对象等,注解的使用变得十分明确。它的取值由ElementType类提供

  • ElementType.TYPE :作用于类、接口(包括注解类型接口)或者枚举类型。
  • ElementType.FIELD:作用于字段属性。
  • ElementType.METHOD:作用于方法。
  • ElementType.PARAMETER:作用于参数。
  • ElementType.CONSTRUCTOR:作用于构造器。
  • ElementType.LOCAL_VARIABLE:作用于局部变量。
  • ElementType.ANNOTATION_TYPE:作用于注解。
  • ElementType.PACKAGE:作用于包。
  • ElementType.TYPE_PARAMETER:作用于类型参数(since jdk1.8)。
  • ElementType.TYPE_USE:作用于使用的类型(since jdk1.8)。
  • ElementType.MODULE:作用于模块声明(since jdk9)。

2.4 @Inherited(继承)

Inherited意为 继承,它不是指此注解本身会被继承,而是被@Inherited修饰的类的子类,在没有被任何注解修饰的话,那么这个子类就继承了父类的注解。例:

// 1.先定义一个注解
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {}// 2.B继承A,那么B没有被任何注解修饰,那么B继承A的注解
@Test
public class A {}
public class B extends A {}

2.5 @Repeatable(可重复)

Repeatable意为 可重复,jdk1.8新特性。它表示修饰的注解可以重复被使用。例如:

一个开发人员会使用c、c#和java

// 1.定义容器注解,存储各种各样的Language类型
@Retention(RetentionPolicy.RUNTIME)
@interface Languages{Language[] value();
}// 2.定义Language注解
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Languages.class)
public @interface Language {String tool() default "";String value() default "";
}// 3.使用自定义的注解修饰类
@Language(tool ="c")
@Language(tool ="c#")
@Language(tool ="java")
public class Developer{// ...
}

上面的代码中,@Repeatable 注解了 Language。而 @Repeatable 后面括号中的类相当于一个 容器注解。容器注解 是用来存放其它注解的地方,它本身也是一个注解。

代码中的相关容器注解:

@interface Languages{Language[] value();
}

按照规定,它里面必须要有一个 value 的属性,属性类型是一个被 @Repeatable 注解过的注解数组,注意它是 数组


3.注解的属性

注解的属性又称成员变量。

3.1 使用

一般使用

定义的成员变量,应该在使用注解的是赋值,以键值对形式赋值(这里还是以为上面的代码为例):

// 使用@Language
@Language(tool ="c",value = "master")
public class Developer{// ...
}

多个属性需要赋值,使用逗号隔开。

单个参数传递

只需要传递一个参数的时候,如果需要传递数据的属性名为value,在对其进行赋值的时候,可以不写value=,直接写一个值即可,如下:

@Language(value = "master")
// 等价于
@Language("master")

无参数传递

当使用的注解,不需要传递参数的时候,就可以不写括号,如下:

@Language()
// 等价于
@Language

3.2 定义

注解当中只有成员变量,没有方法(虽然是方法的声明格式)。注解的成员变量在注解的定义中以普遍Java代码中方法的声明形式来声明,方法明定义了该成员变量的名字,返回值类型定义了该成员变量的类型。

在注解中定义属性时,它的类型必须是 8种基本类型 或 类、接口、注解及它们的数组

8种基本类型:boolean、byte、short、char、int、long、float、double

且属性可以有默认值,使用defalut设置,若属性没有设置默认值,在使用该注解的时候,就必须传递参数。示例:

// 1.有属性的自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Languages.class)
public @interface Language {String tool() default "";String value() default "";
}// 2.无属性的自定义注解
public @interface Environment {}

注解也可以不做任何属性声明,这个时候使用该注解的是,就不用些括号。

至此,就可以自定义注解了。


4.注解的获取(反射)

使用注解修饰类或方法,就是为了指定的场景下能够达到指定的目的,但是注解毕竟只是一个标签,真正实现功能的还得借助Java的反射获取注解信息来实现。

先查看获取注解对象的方法(Class、Method、Field都有):

  1. public <A extends Annotation> A getAnnotation(Class<A> annotationClass):获取指定类型的注解对象。
  2. public Annotation[] getAnnotations():获取全部注解,返回注解数组。

需要使用反射获取到的注解,一定的声明@Retention(RetentionPolicy.RUNTIME),只有保留到RUNTIME才能获取到,否则是会抹去此注解的。

4.1 获取类上注解对象

这里就以获取class类上的注解为例(还是使用上面声明的注解),Developer声明如下:

@Language(tool = "java",value = "master")
public class Developer {}

下面就是获取并打印

Class c = Developer.class;// 1.使用getAnnotation() 获取指定的注解
Language language = (Language) c.getAnnotation(Language.class);
System.out.println("tool:"+language.tool());
System.out.println("value:"+language.value());// 2.使用getAnnotations() 获取全部注解
Annotation[] as = c.getAnnotations();
for(Annotation annotation:as){if(annotation instanceof Language){System.out.println("tool:"+language.tool());System.out.println("value:"+language.value());}
}

输出的结果都是:

tool:java
value:master

4.2 类、方法上注解对象

在了解了如何获取类上的注解对象之后,获取属性、方法上的注解对象就简单了,只要获取到Class、Method、Field对象之后,就 调用getAnnotation()getAnnotations() 方法即可获取到对应的注解对象


5.注解的使用需求

学习注解之后,如果没有实际应用,忘记肯定比学的快。如果我们明确了它的使用需求,再加以使用,那当然最好不过。

官方文档对注解的描述:

注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。

注解有许多用处,主要如下:

  • 提供信息给编译器: 编译器可以利用注解来探测错误和警告信息
  • 编译阶段时的处理: 软件工具可以用来利用注解信息来生成代码、Html文档或者做其它相应处理。
  • 运行时的处理: 某些注解可以在程序运行的时候接受代码的提取

值得注意的是,注解不是代码本身的一部分。

简单点说就是:注解无法改变代码本身,注解只是工具。同时,开发者开发的用于处理 Annotation 的代码统称为APT(Annotation Processing Tool)

说了这么多的概念,不好理解,也记不住,解决方法来了:【点击跳转阅读注解+反射的实际应用】。

同时,spring框架中使用大量的注解,感兴趣可以去看一下源码。


6.Java预设的注解

做一个扩展,点到为止

相信在我们日常写代码的是,有几个注解是接触很多的。

  • @Deprecated:Deprecated意为 弃用、过时,Java语言在不断的迭代中,针对同一需求不断的优化解决方案,旧的解决方案就会使用@Deprecated标记过时,但是还是可以正常使用
  • @Override:重写父类方法需要使用@Override。
  • @SuppressWarnings:阻止警告。
  • @SafeVarargs:参数安全类型注解。
  • @FunctionalInterface:函数式接口注解,这个是 Java 1.8 版本引入的新特性

函数式接口:就是接口中只有一个抽象方法,其他方法都不能是抽象的。


看完这篇Java注解,我要在学妹面前吹牛皮~相关推荐

  1. 看完这篇java单利模式文章,面试的时候再也不怕了

    来源:https://blog.csdn.net/weixin_44170221/article/details/106365623 哇塞,被称为Java中最简单的设计模式--单例设计模式.这都可以有 ...

  2. 看完这篇Java基础,你也是天花板

    点击获取 15张学习路线导图 10G学习资料 100本计算机书籍

  3. java与python难度对比_Python和Java的区别,看完这篇文章你就清楚啦

    众所周知,在数不清的编程语言中Java自诞生之日起长盛不衰,可谓是神话般的存在.随着人工智能时代的到来,Python迅速席卷全球,作为当下最热门的编程语言,因其简单实用且应用场景广泛备受青睐. 一个是 ...

  4. 程序员要怎么高效学习Java,大学生or小白的你看完这篇的你离BAT又近了一大步

    这篇文章大体上会从以下几个部分展开: 认清自己. 学习目的. 时间管理. 学习方法. 学习的步骤. 获取知识的途径 影响学习的几个因素 自己的心态. 外物的影响. 其他想说的 大学生的学习 一些感悟 ...

  5. 看完这篇你还敢说分不清 Java 类 对象 实例 变量间的区别?

    看完这篇你还敢说分不清 Java 类 对象 实例 变量间的区别? 什么是类? 什么是对象? 什么是变量? 对象和类的关系: Java中的类: Java中的对象 Java中的变量 Java 中调用 对象 ...

  6. java 铺地板问题_客厅铺地板后悔了?看完这篇文章再说...

    原标题:客厅铺地板后悔了?看完这篇文章再说... 最近有网友说客厅铺木地板很后悔, 其实通铺了木地板的客厅, 真的很温馨,家的港湾莫过于此. 对于喜欢光脚在家的人来说, 客厅如果是铺地砖, 冰冰凉凉, ...

  7. 为何看完这篇RxHttp Http请求框架会觉得如此销魂,全文干货建议收藏!

    前言 RxHttp相较于retrofit,功能上,两者均能实现,并无多大差异,更多的差异体现功能的使用上,也就是易用性,如对文件上传/下载/进度监听的操作上,RxHttp用及简的API,可以说碾压re ...

  8. 收藏!最详细的Python全栈开发指南 看完这篇你还不会Python全栈开发 你来打我!!!

    Python Web全栈开发入门实战教程教程    大家好,我叫亓官劼(qí guān jié ),这个<Python Web全栈开发入门实战教程教程>是一个零基础的实战教程,手把手带你开 ...

  9. 手把手教你完成CSDN对接百度统计 看完这篇文章你还不会对接 欢迎您提刀顺着网线来砍我!!!!

    大家好,我是:じ☆ve朽木,开发经验都是一步一步慢慢积累的,没有谁生来就具有的,只要我们付出了努力,肯定就会有收获!进入我的博客,带你了解Java知识,js小技巧,带你玩转高端物联网.博客地址为:じ☆ ...

最新文章

  1. java初学者必看——J2SE小结
  2. OEA 框架演示 - 快过原型的开发
  3. 美国空军开发新型机载网络技术
  4. GDCM:将PDF文件转换为DICOM / PDF文件的测试程序
  5. 8、play框架中持久层操作
  6. Pi network到底怎么样?我们来深入剖析一下
  7. 二叉搜索树的第k个节点
  8. c# define 类似_c#跟c++的相似之处
  9. kernel的initcall函数
  10. StanfordDB class自学笔记 (11) Indexes and Transactions
  11. 清华大学android源码下载网站地址
  12. python画二元一次函数图像_Python实现的拟合二元一次函数功能示例【基于scipy模块】...
  13. java 生化危机_生化危机3D(CAPCOM经典)
  14. bzoj2429: [HAOI2006]聪明的猴子(最小生成树)
  15. 无需编程,DIY自己智能小车的Android蓝牙遥控软件(一)
  16. 明日之后八级房怎么造?明日之后好看的八级房蓝图造型汇总
  17. 安全之路 —— 利用端口复用技术隐藏后门端口
  18. 网络受限_受限人工神经网络对幸福的追求
  19. 卸载了PL/SQL Developer,说一下与Toad for Oracle的对比
  20. 笔记本锁定计算机功能键,笔记本电脑键盘锁的设置方法以及解锁步骤【图文教程】...

热门文章

  1. ShellCode原理以及编写
  2. matlab点云中值滤波,基于车载激光雷达的车道线识别方法与流程
  3. 四通道数字隔离器芯片π142E31S Pai142E31S完全代替NSi8142S1
  4. 产品经理是干什么的?产品经理的工作内容与职责
  5. KindlePW3壁纸越狱设置问题
  6. 超详细的三菱PLC 与多台变频器 MODBUS通讯程序 非常适合学习PLC编程或初学者及对三菱PLC编程需要爱好者
  7. python不同函数参数可传入参数的区别
  8. LayUI模板引擎渲染数据
  9. 基础-06-日语中那些表示「是」的助动词
  10. 读书笔记·高效睡眠法