烦了就吃饭去

注解

注解:
长什么样?----》@注解名

注解是什么?
注解也是注释,这是代码级别的注释,用代码给代码注释。

注解有三个部分构成:
(1)声明注解,定义注解
我们在开发中,绝大多数都是别人定义好的
(2)使用注解(重要)
我们开发中,主要是这步,使用注解
(3)读取注解的信息
我们把读取注解信息的代码称为“注解信息处理流程”,如果没有(3)前面两步都没有意义。
读取注解的信息的代码基本上也是别人写的。
读取注解信息的代码需要“反射”知识。

 

常见的注解:
一、系统预定义的三个最最基本的注解
1.@Override
它是由JDK的核心类库定义,读取它是由编译器,例如:javac.exe
作用:注释这个方法是一个“重写”的方法,让编译器对这个方法的签名进行格式检查,是否满足“重写”的要求。

重写的要求:
(1)方法名称和形参列表必须相同
(2)返回值类型:
基本数据类型和void:必须相同
引用数据类型:<=
权限修饰符:>=

哪些方法不能重写:
(1)static
(2)final
(3)private

2.@SuppressWarnings(+++)“()”里面写警告类型
它是由JDK的核心类库定义,读取它的是编译器,例如:javac.exe
作用:抑制警告
通过@SuppressWarnings的源码知道,可以注解目标可以是类、字段、函数、函数入参、构造函数和函数的局部变量,注解应该放在要警告语句的的上边,不建议放在类的外面,或者其它地方。

抑制警告的关键字:
all***** 抑制所有警告
boxing 抑制装箱、拆箱操作时候的警告
cast 抑制映射相关的警告
dep-ann 抑制启用注释的警告
deprecation***** 抑制过期方法警告
fallthrough 抑制确在switch中缺失breaks的警告
finally 抑制finally模块没有返回的警告
hiding 隐藏以抑制相对于隐藏变量的本地的警告
incomplete-switch 禁止相对于switch语句中缺少条目的警告(枚举案例)
nls 禁止相对于非nls字符串文字的警告
null***** 忽略对null的操作
rawtypes使用generics时忽略没有指定相应的类型
restriction禁止使用劝阻或禁止引用的警告
serial 忽略在serializable类中没有声明serialVersionUID变量
static-access***** 抑制不正确的静态访问方式警告
synthetic-access 抑制子类没有按最优方法访问内部类的警告
Unchecked****** 抑制没有进行类型检查操作的警告
unqualified-field-access 抑制没有权限访问的域的警告
unused****** 抑制没被使用过的代码的警告
javadoc 禁止相对于javadoc警告的警告
rawtypes 禁止相对于原始类型的使用的警告
static-method 禁止相对于可声明为静态的方法的警告
super 禁止相对于覆盖没有超级调用的方法的警告
resource 禁止相对于Closeable类型的资源使用的警告
sync-override 在重写同步方法时因为缺少同步而禁止显示警告


3.@Deprecated
(它可以放在类的上面一行,或者方法的上一行,或者属性的上一行,使用后,此类、方法、属性的名字单词中间多一条横线,和删除线形式一样。)
它是由JDK的核心类库定义,读取它的是编译器,例如:javac.exe
作用:告知编译器和程序员这个方法、属性、或类等已经过时,不建议使用,如果使用出了问题,自己负责。

二、用于文档注释的注解

Java中的注释:
(1)单行注释
(2)多行注释
(3)文档注释,Java特有
需要配合注释使用

@author
@version
@since
。。。。
@param
(1)必须该方法有形参,才能写,有几个形参,写几个
(2)@param 形参名 形参数据类型 解释
@return
(1)必须方法的返回值类型不是void,一个方法@return 最多有一个。
(2)@return 返回值类型 解释
@throws
(1)必须方法throws异常,有几个写几个
(2)@throws 类型 解释

关于文档注释的日期配置:
eclipse中:window--》prefrences--》java--》code template--》comments--》type--》插入变量
新版本不再用@date来进行时间注解了。

三、单元测试相关的注解
(网址的结尾:com(商业相关)、edu(教育相关)、gov(政府相关)、org(非营利组织))

1.声明:第三方回归测试框架声明,不是JDK声明。
2.读取:有JUnit框架来读取。
3.使用
(1)引入第三方回归测试框架jar(一堆类的class文件)
目前的IDE(Eclipse、IDEA)都有集成

项目名上右键--》Build Path--》Add Library--》JUint--》选择版本(现在用的多的是第4版本)--》finish

(2)可以使用的注解(在方法上)
@Test(所在包为org.junit.Test)(掌握)
运行:
(1)Run as --> JUnit Test 单元测试(可以只针对这个方法进行测试运行)
(2)如果没有选择方法,那么当前类的所有的@Test标记的方法都会被执行,如果选中了其中一个方法,就只执行被选中的方法。
要求:
用@Test标记的方法有要求:JUnit4版本
(1)这个方法本身必须是public、void、()(形参列表为空)。如果想要针对形参列表不为空的方法进行单元测试,那么会报错,可以通过一个调用了此形参列表不为空方法的形参列表为空的方法来进行,测试这个形参列表为空的方法即可。
(2)这个方法所在的类也必须是public的。

了解
@Before:在每一个@Test标记的方法之前运行
@After:在每一个@Test标记的方法之后运行
@BeforeClass:在当前类初始化时执行,只执行一次,方法必须是static的。
@AfterClass:所有的方法之后,只执行一次,方法必须是static的。
白盒测试:程序猿自测,需要明确知道测试的代码的编写,功能。。。
黑盒测试:测试人员,不需要知道功能如何实现,只对着用户的需求文档,性能要求,安全要求进行各种测试。

四、自定义注解

(1)声明
(2)使用
(3)读取

1.声明
格式:
【权限修饰符】 @interface 注解名{
}

2.使用
@注解名

3.读取
特别说明,如果需要用“反射”来读取某个注解,那么这个注解声明的时候,一定要加这个元注解@Retention(RetentionPolicy.RUNTIME)。

五、元注解
元注解:注解注解的注解,给注解加的注解,在注解声明时,在上面加的注解。
元数据:

1.@Target(++)
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.TYPE})
ElementType枚举类的取值:
》CONSTRUCTOR:用于描述构造器
》FIELD:用于描述域(字段,属性)
》LOCAL_VARIABLE:用于描述局部变量
》METHOD:用于描述方法
》PACKAGE:用于描述包
》PARAMETER:用于描述参数
》TYPE:用于描述类、接口(包括注解类型)或enum声明。

用来标记这个注解可以用在++位置。
这个位置由ElementType枚举类的常量对象来决定。

2.@Retention(++)
@Retention(RetentionPolicy.RUNTIME)
作用:标记这个注解可以滞留到++阶段。
这个生命周期由RetentionPolicy枚举类的常量对象来指定。常量对象含有:SOURCE(源代码)、CLASS(字节码阶段)、RUNTIME(运行时)。如果没有写此注解,则默认为SOURCE阶段。

3.@Documented
作用:标记这个注解是否可以被javadoc.exe读取到API中。

4.@Inherited
作用:标记这个注解是否可以被子类继承。

六、配置参数
1.如何声明配置参数
格式:
【权限修饰符】 @interface 注解名{
数据类型 配置参数名1();
数据类型 配置参数名2();
}

配置参数体只能用public或者缺省来修饰。

2.配置参数的赋值问题
(1)如果注解声明的时候配置参数,那么在使用这个注解的时候,要求给这个配置参数进行赋值。
标准的赋值格式:(配置参数名1 = 参数值1,配置参数名2 = 参数值2。。。)
(2)如果配置参数的个数只有一个,并且名称是value,那么可以省略“配置参数名1 =”
(3)配置参数如果有默认值,那么可以不赋值。例如:数据类型 配置参数名2() default “尚硅谷”;

总结:default
(1)switch
(2)接口的默认方法
(3)自定义注解的配置参数默认值

3.配置参数的类型有要求
类型只能是8种基本数据类型、String类型、Class类型、enum类型、Annotation类型、以上所有类型的数组。

静态导入:
传统导入方式:import java.lang.Math;
然后在代码里面的用法就是 Math.PI
静态导入方式:import static import java.lang.Math.*;
然后在代码里面的用法就是 PI

1.8之后JDK有可重复注解
(1)必须在@注解名上面加一个元注解@Repeatable(++)
“++”这个可重复注解在哪个容器中可以使用,这个容器必须是一个注解类型
(2)这个可重复的注解,必须和容器的target是一样的,或者比容器的这个target大。不写的话默认是所有target的对象值都可以。

 

posted on 2020-05-12 16:13  烦了就吃饭去  阅读(278)  评论(0编辑  收藏  举报

导航