注释部分
注解
概念:说明程序。For计算机
从JDK1.5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。
注释:用文字描述程序。For程序员
作用
-
编写文档:标识生成doc文档
1
2
3
4
5
6
7
8
9
10
11
12
13
14package LearnJunit.annotation;
/**
* 注解 java doc演示
* @since 1.5
* @author joe1sn
* @version 1.0
*/
public class AnnoDemo1 {
//计算两数之和
public int add(int a, int b){
return a+b;
}
}javadoc AnnoDemo1.java -encoding UTF-8 -charset UTF-8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18正在加载源文件AnnoDemo1.java...
正在构造 Javadoc 信息...
标准 Doclet 版本 1.8.0_301
正在构建所有程序包和类的树...
正在生成.\AnnoDemo1.html...
正在生成.\package-frame.html...
正在生成.\package-summary.html...
正在生成.\package-tree.html...
正在生成.\constant-values.html...
正在构建所有程序包和类的索引...
正在生成.\overview-tree.html...
正在生成.\index-all.html...
正在生成.\deprecated-list.html...
正在构建所有类的索引...
正在生成.\allclasses-frame.html...
正在生成.\allclasses-noframe.html...
正在生成.\index.html...
正在生成.\help-doc.html... -
代码检查:代码分析(使用反射)
例子: @Override
也可以自定义注解【使用反射】
-
让编译器实现基本的检查
JDK预定义注解
-
@Override
编译检查,检查被标记方法是否是被父类覆写的方法
-
@Deprecated
该注解内容已过时
-
@SuppressWarnings
压制警告,需要传参,一般传递"all"压制所有警告
自定义注解及使用(解析)
格式
1 |
|
1 | 元注解 |
本质:注解本质上就是一个接口,接口默认继承Annotation()
1 | public interface MyAnno extends java.lang.annotation.Annotation { |
属性:接口中可以定义的成员方法
-
要求:
-
属性返回类型
- 基本数据类型
- String
- 枚举
- 注解
- 以上类型数组
1
2
3
4
5
6
7public MyAnno {
int show1();
String show2();
Person per(); //枚举
MyAnno2 anno2();//注解
String[] strs();//字符串数组
} -
定义的属性在使用时需要给属性赋值
缺少赋值:
只留下show1进行赋值
默认赋值
1
2
3
4public MyAnno {
int age();
String name() default "Doe";
}如果只有一个属性需要赋值,如果属性名称是value,直接赋值
1
2
3
4
5
6package LearnJunit.annotation;
public class Worker {
}对于枚举、注解、字符串的注解
1
2
3
4
5
6
7
8
public class Worker {
}
-
元注解:用于描述注解的注解
-
@Target:描述注解能够作用的位置
ElementType取值:
- TYPE:作用于类上
- METHOD:作用于方法上
- FIELD:作用于成员变量上
1
2
3
4
5
6
7
8//表示anno3注解只能作用于类上
public MyAnno3 {
} -
@Retention:描述注解能被保留的阶段
RetentionPolicy:判断在哪个阶段,使用该注解
- SOURCE
- CLASS
- RUNTIME(一般使用这个):会保留到class字节码文件中,并被JVM读取到
-
@Documented:描述注解是否被抽取到api文档中
1
2
3
4
5
6
public class Worker {
public String name = "John";
public void show(){};
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20/**
*
- @Target:描述注解能够作用的位置
- @Retention:描述注解能被保留的阶段
- @Documented:描述注解是否被抽取到api文档中
- @Inherited:描述注解是否这子类继承
*/
import java.lang.annotation.*;
//表示anno3注解只能作用于类上
public MyAnno3 {
}删除该注解后
-
@Inherited:描述注解是否被子类继承
解析注解
将配置文件的工作交给注解完成
1 | /** |
1 | package LearnJunit.annotation; |
关于步骤2,在 21行下个断点
这个时候注解相关的都还没有对应数据,但是获得了注解(.getAnnotation
)对象后
不仅reflectFrameworkClass
注解有了值,而且在内存中多出了一个an
变量,而an
就是我们注解的内容
最后加上
1 | //4.反射获得类 |
就能使用注解中的类的对应方法了
案例
测试类
LearnJunit.annotation.demo.Calculator
1 | package LearnJunit.annotation.demo; |
测试注解
LearnJunit.annotation.demo.check
1 | package LearnJunit.annotation.demo; |
测试方法
LearnJunit.annotation.demo.testCheck
1 | package LearnJunit.annotation.demo; |
小结
- 大多数时候使用注解而不是自定义注解
- 注解给谁用:
- 编译器
- 解析程序(checkTest)
- 注解不是程序的一部分(相当于C的编译参数,如预编译命令)