一、注解的理解
1、jdk5.0新增
2、在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。
3、Annotation 其实就是代码里的特殊标记, 这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用 Annotation, 程序员可以在不改变原逻辑的情况下, 在源文件中嵌入一些补充信息。
二、注解的使用示例
示例1:生成文档相关的注解
/**
*
* @Description 返回当前团队的所有对象
* @author suxintai
* @date 2022年11月14日下午7:38:19
* @return 包含所有成员对象的数组,数组大小与成员人数一致
*/
public Programmer[] getTeam(){
Programmer[] team = new Programmer[total];
for(int i=0;i<team.length;i++){
team[i] = this.team[i];
}
return team;
}
/**
*
* @Description 从团队中删除成员
* @author suxintai
* @date 2022年11月14日下午7:40:04
* @param memberId
* @throws TeamException
*/
public void removeMember(int memberId) throws TeamException{
int i = 0;
for(;i<total;i++){
if(team[i].getMemberId() == memberId){
team[i].setStatus(Status.FREE);
break;
}
}
if(i>=total){
throw new TeamException("找不到该成员,无法删除");
}
for(int j = i;j<total-1;j++){
team[j] = team[j+1];
}
// team[total-1] = null;
// total--;
team[--total] = null;
}
示例2:在编译时进行格式检查(JDK内置的个基本注解)
@Override: 限定重写父类方法, 该注解只能用于方法
class Student extends Person{
@Override
public void wolk() {
System.out.println("学生走路");
}
}
@Deprecated: 用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
@SuppressWarnings: 抑制编译器警告
示例3:跟踪代码依赖性,实现替代配置文件功能,比如:Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署。
三、如何自定义注解:仿照@SuppressWarnings
说明:
1.声明为@interface
2.内部定义成员,通常使用value表示
3.可以指定成员的默认值,使用default来定义
4.如果自定义注释没成员,表明是一个标识作用
如果注解成员,在使用注解时,必须指明注解的成员的值,自定义注解必须配上注解的信息处理流程(使用反射才有意义)。
代码示例:
public @interface MyAnnotation {
String value() default "hello";
}
四、元注解 :对现有的注解进行解释说明的注解。
JDK5.0提供了4个标准的meta-annotation类型,分别是:
1、Retention: 用于指定该 Annotation 的生命周期(SOURCE、CLASS(默认行为)、RUNTIME,只有声明为RUNTIME生命周期的注解才可以通过反射来获取。
2、Target:用于指定被修饰的 Annotation 能用于修饰哪些程序元素。
以下两种元注解出现频率较低:
3、Documented:用于指定被该元 Annotation修饰的Annotation类将被javadoc工具提取成文档。默认情况下,javadoc是不包括注解的。定义为Documented的注解必须设置Retention值为RUNTIME。
4、Inherited: 被它修饰的Annotation将具继承性。如果某个类使用了被@Inherited修饰的Annotation, 则其子类将自动具该注解。
类比:元数据的概念:String name = "Tom";
五、 如何获取注解信息
通过反射获取注解信息(这段内容到后面反射机制中讲解)
前提:只声明为RUNTIME生命周期的注解才可以通过反射来获取。
六、JDK8中注解的新特性
jdk8中新增了两种注解:可重复注解、类型注解
1.可重复注解:①在MyAnnotation中声明@Repeatable(),参数为MyAnnotation1.class
②MyAnnotation中的Retention、Target等注解必须和MyAnnotation1保持一致。
2.类型注解
ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明)。
ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(MyAnnotation1.class)
@Inherited
@Target({ElementType.METHOD,ElementType.CONSTRUCTOR,ElementType.TYPE,ElementType.TYPE_PARAMETER,ElementType.TYPE_USE})
@Documented
public @interface MyAnnotation {
String value() default "hello";
}
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target({ElementType.METHOD,ElementType.CONSTRUCTOR,ElementType.TYPE})
public @interface MyAnnotation1 {
MyAnnotation[] value();
}