java_注解
什么是注解?
首先需要明确一个概念,注解也是类,在内存中有着对应的class文件
注解是JDK1.5的特性
注解相当于一种标记,是类的组成部分,可以给类携带一些额外的信息.
标记(注解)可以加载包,字段,类,方法,方法参数以及局部变量上.
注解是给编译器或者jvm看的,编译器或jvm可以根据注解来完成对应的功能.
注解的作用?
注解的作用主要就是给程序带入参数
以下几个常用操作中都使用了注解
- 生成帮助文档
@author 用来标识作者名称
@version 用来标识对象的版本号,适用范围:文件,类,方法
- 编译检查
@override 用来告诉编译器该方法是重写父类中的方法,如果不存在或者有错误,则编译失败
- 框架的配置(框架等于代码+配置)
还有一些较为常用的注解:
@supressWarning 警告不显示,可以传入参数,参数为all时整个类都不显示警告
@FunctionalInterface 函数式接口(只有一个自己特有抽象方法的接口)
@Test junit测试
@Deprecated 过时,不建议使用
什么是Junit?
1).什么是"JUnit":它是一个第三方的软件包,它的作用:让我们可以很方便的进行“单元测试”。
2).以后我们的程序会非常庞大,模块非常多,方法也非常多,此时测试某个方法就很不方便-需要启动程序,
然后一步一步操作才能到达我们想测的方法。
3).JUnit的功能:可以代替main()方法,在任意的类中可以测试运行某个方法。达到方便测试的目的。
4).JUnit是基于“注解”的。
Junit的使用@Test
Junit是java语言的单元测试框架,简单理解可以取代java程序中的main方法,Junit属于第三方工具
在需要测试的方法声明上一行加上@Test,导入相应jar包(很多开发环境已经集成了Junit),就可以直接测试方法
JUnit单元测试_其它注解
1).@Before:在@Test之前执行。每个@Test方法执行前都要执行一次@Before。@Before也可以有多个,执行顺序:
1).按方法名的长度:降序;
2).再按方法名:降序;
2).@After:在@Test之后执行。每个@Test方法执行后,都要执行一次@After。@After也可以有多个,执行顺序:
1).按方法名长度:升序;
2).再按方法名:升序
3).@BeforeClass : 用在静态方法上,在所有的@Before之前执行,而且只执行一次。
4).@AfterClass : 用在静态方法上,在所有的@After之后执行,而且只执行一次。
注解_自定义注解的基本格式
public @interface MyAnno{
}
但这个注解定义后,有两个问题:
1).这个注解可以用在类的任何位置--使用"元注解"来解决;
2).我们的注解没有起到任何作用--使用"自定义的注解解析器"来解决;
注解_元注解
是自定义注解使用的
1).什么是“元注解”:它也是一个“注解”,但这个注解必须用在“注解的定义”上。
它可以约束我们定义的注解:
1).使用的位置:@Target
1).类 :ElementType.TYPE
2).成员属性 :ElementType.FIELD
3).成员方法 :ElementType.METHOD
4).构造方法 :ElementType.CONSTRUCTOR
5).局部变量上 :ElementType.LOCAL_VARIABLE
6).形参: :ElementType.PARAMETER
2).生命周期:@Retention
' 1).源码:不会被编译到class中。 RetentionPolicy.SOURCE
例如:@Overrite
2).class中:会存在于源码、class文件中,但运行时不会被加载到内存:RetentionPolicy.CLASS
3).运行时(内存):会存在于源码、class文件、运行时内存:RetentionPolicy.RUNTIME
例如:JUnit的@Test....
2).示例代码:
//约束注解只能在类上使用 @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnno { }
注解_解析注解
1).模拟JUnit的注解解析器。
前提:
1).自定义注解@MyTest,必须是:用在方法上,生命周期:运行时;@MyTest
2).使用自定义注解;Student
3).自定义注解解析器,使用反射解析“使用自定义注解的类”,根据使用注解的情况,来决定怎样执行。MyAnnoTest
2).见:demo10
注解_定义包含属性的注解
1).格式:
public @interface 注解名{
数据类型 属性名() [default 默认值];
}
数据类型:各种基本类型、String、枚举类型。注意:没有包装类型。
属性名:自定义标识符;
注意:如果注解中只有一个属性,而且叫:value
使用注解时,可以省略这个“属性名”
@CheckName(value = 1) public void show(){ System.out.println("show..."); } @CheckName(value = 3) public void aaa(){ System.out.println("aaa..."); } @CheckName(2)//直接写值 public void x(){ System.out.println("x..."); } @CheckName(4) public void bbb(){ System.out.println("bbb..."); }
默认值:如果定义了“default 默认值”,在使用注解时,不是必须要为这个属性定义值,
使用默认值。但如果没有定义“default 默认值”,在使用注解时,必须显示的为这个属性设置值。