JavaWeb——2.注解

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

这篇文章我们来讲一下Java中的注解

其实这部分内容算是Javaweb的补充内容其中还包括Junit测试和反射的相关内容。 Junit测试是一个比较简单的内容这里就不写了而反射的相关内容可以看java基础专栏那里面有详细的叙述。

目录

1.注解概述

2.jdk里面已经定义的注解

2.1 @Override注解

2.2 @Deprecated注解

2.3 @SuppressWarnings(参数)

3.自定义注解

4.在程序中解析注解

5.具体案例


1.注解概述

首先我们来对注解进行一个全面的认识

注解概念用来说明程序的是给计算机看的

格式@+注解名称

解释我们知道java里面有注释注释的概念是用文字描述程序给程序员看的我们类比注释就给出了注解的概念。唯一不同的是注解是给计算机看的

注解的分类

  1. 编译检查通过代码里面标识的注解让编译器可以实现基本的编译检查例@Override
  2. 编写文档通过代码里面标识的注解来生成文档生成doc文档也就是api文档生成类的文档的命令javadoc 类名
  3. 代码分析通过代码里标识的注解对代码进行分析使用反射

说明编译检查很简单就是程序在编译的时候对代码进行检查看看它是否符合语法格式典型的就是对方法的重写时用的注解@Override编写文档也很容易理解就是我们给程序加上注解然后如果我们要生成api文档那么就会生成加了注解的部分代码分析这里先不阐述

关于注解我们要学习的内容

  1. jdk里面定义的注解
  2. 自定义注解
  3. 在程序中使用解析注解

2.jdk里面已经定义的注解

首先我们先来了解一下jdk里面已经定义了的注解。主要了解以下三个

  1. @Override 检测被标记的方法是否是基础父类接口的
  2. @Deprecated 该注解标识的内容表示已过时
  3. @SuppressWarnings(参数) 用来压制警告的其中的参数一般传递all表示压制所有警告

2.1 @Override注解

这个注解就不过多赘述了我们已经用了很多次了

直接看一下代码吧

很简单不多讲

2.2 @Deprecated注解

这个注解是用来表示标识的内容已经过时了

注意是可以用但是已经过时了。就比如一个程序有了一个新功能旧的功能过时了所以我们要对旧的功能进行表示但是因为还有人会用旧的功能所以旧的功能还是可以用的

看下代码

第16行的注解表示方法show1()过时了所以在第28行输入的时候idea显示的show1()上面划了条横线但是注意show1()方法还是可以用的

2.3 @SuppressWarnings(参数)

@SuppressWarnings(参数)注解是用来压制警告的

具体的看一下代码

这些标黄的位置就是警告不是错误不影响程序运行

然后我们加上注解看一下

 如图所示警告就没有了

里面的参数我们一般传入的是all表示压制所有的警告

对于这个注解我们一般是直接标识在类上的这样就可以压制整个类的警告了

 如图所示我们这整个类都没有警告了

3.自定义注解

下面我们来尝试一下自定义注解

我们来看一下java中注解的格式

它大体上是分两部分组成的。第一部分元注解就是49和50两行第二部分注解定义就是第51行

所以注解格式如下

元注解
public @interface MyAnno {

}

我们仿照它也来定义一个注解

 

 这里再说明一点内容我们定义了一个注解然后进行编译然后在用javap命令反编译就能看到注解的本质

注解的本质注解本质上是一个接口该接口默认继承Annotation接口

接口反编译出来的内容public interface MyAnno extends java.lang.annotation.Annotation{}

所以说注解本质上是一个接口接口里面能写的内容常量、抽象方法注解里面都可以写

但是有所要求

  1. 属性的返回值类型只能包括基本数据类型、String、枚举、注解、以上类型的数组只能包括这五大类
  2. 定义了属性在使用时要给属性赋值赋值格式为 属性名=值还可以使用default关键字给属性赋默认值
  3. 如果只有一个属性需要赋值并且属性名为value那么可以直接写值不用写value

下面来看一个自定义的注解

这是自定义的注解里面写了内容

下面看一下这个注解的使用

 很简单key-value的形式

下面再来讲一下元注解

元注解用于描述注解的注解是jdk已经定义好的
需要掌握的元注解

  1. @Target用于描述注解能够作用的位置三个取值TYPE只作用于类上METHOD只作用于方法上FIELD只作用与成员变量上
  2. @Retention描述注解被保留的阶段 @Retention(RetentionPolicy.RUNTIME)表示当前被描述的注解会保留到class字节码文件中并被jvm读取到我们自己写的注解一般是选RUNTIME
  3. @Document描述注解是否被抽取到api文档中
  4. @Inherited描述被该注解描述的注解注释的类的子类会自动继承这个注解

下面来看一下具体的实例

 我们写自定义的注解时一般只用前两个注解后面两个一般不用

注解的定义就是这么多的内容

4.在程序中解析注解

下面我们通过具体的实例来看下注解的在程序中的解析

如图所示这是我们自定义的一个注解

 这个是我们在程序中使用我们自定义的注解

 这个就是运行的结果

我们在程序中解析注解实质上就是在程序中获取注解里面的内容它包含以下三部分

  1. 获取注解定义的位置的字节码文件
  2. 获取指定的注解
  3. 调用注解中的抽象方法来获取配置的属性值

 这在上面的程序中也是对应上的运行方法啥的运用的是反射的技术

5.具体案例

情景你写了一个计算器能够进行四则运行现在要求你写一个测试框架来测试你的计算器是否可以正确运算如果有错请返回文件指出错误

代码如下

 这是计算器类

这是我们写的注解

 这是我们的测试框架

这是运行结果

最后我们小结一下

我们以后是要会使用注解而不是自定义注解来使用。注解给谁用注解给计算机用给解析程序用这个解析程序就是类似于我们的TestCheck类注解是给这二者用的。并且注解不是我们程序的一部分可以将注解理解为一个标签它不是程序的一部分。 

 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java