Java从零开始学四十七(注解简述)

一、Java 中注解 Annotation

什么是注解:用来描述数据的数据(元数据)。

Java 代码里的特殊标记。它为代码中添加用 Java 程序无法表达的额外信息提供一种形式化的方法,使用我们可以在未来的某一个时刻方便的使得这些注解修饰的程序元素。

 作用:

用将由编译器来测试和验证的格式,存储有关程序额外信息

生成 描述符文件,甚至是新的类定义

减轻编写模板代码的负担

使代码更加干净易读

 注解和注释不同

注解与普通的代码注释有一定的区别,也有一定的联系。注解和注释都属于对代码的描述;

注释的作用只是简单的描述程序的信息,它不会被程序所读取;

注解则是 Java 代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理

通过使用注解,程序开发人员可以在不改变原有逻辑的情况下在源文件中嵌入一些补充的信息,代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者部署。

二、注解语法

使用注解时要在基前面加“@” 符号,同时将注解作为修饰符使用

所有的注解都继承了 java.lang.annotation 包下的 Annotation 接口

 注解语法规范

  • 将注解放在所有修饰符之前
  • 通常将注解单独放置在一行
  • 默认情况下,注解可用于修饰任何元素,包括类,方法,成员,变量等。

三、注解类型

内建注解(也称为基本注解),定义于 java.lang 包下

  • 限定重写父类方法:@Override
  • 标示已经过时:@Deprecated
  • 抑制编译器警告:@SupperssWarnings

元注解(Meta Annotation)

  • @Retention
  • @Target
  • @Documented
  • @Inherited

自定义注解

  使用 @interface 自定义注解

 

@Override

@Override 只能用于修饰方法,而不能修饰其它的元素。

@Deprecated 注解

    private String name;
    private String pwd;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">标示这个属性已经过时,会在这个属性或者方法 名上加上删除线</span>

@Deprecated
private int age;
@Deprecated
public String getName() {
return name;
}

@SuppressWarnings

    @SuppressWarnings("unused")
    public static void main(String[] args) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">没有定义泛型</span>
    @SuppressWarnings("rawtypes"<span style="color: rgba(0, 0, 0, 1)">)

    List list</span>=<span style="color: rgba(0, 0, 255, 1)">new</span> ArrayList();</pre>

 

四、元注解

元注解用来修饰其它的注解位于 java.lang.annotation 下

 

元注解(Meta Annotation)

  • @Retention:用于指定被修饰的注解可以保留多长时间,包含一个 RetentionPolicy 类型的 value 成员变量,使用 Retetion 时必须为该 value 成员变量指定值
  • @Target:有唯一的 value 作为成员变量,value 的类型为 java.lang.annotation.ElementType[] 是被标注的枚举类型
  • @Documented:用于指定被修饰的注解将被 javadoc 工具提取成文档,没有成员变量
  • @Inherited:用于指定被修改的注解将具有继承性

 

五、自定义注解

使用 @interface 关键字

注解类型和接口的相似之处

都可以定义常量,静态成员(如枚举类型定义)。注解类型也可以像接口一样被实现或者被继承

 

package com.pb.annotation.diy;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
自定义注解需要使用 @interface 关键字
*
/
//设置注解可以为 javadoc 获取为帮助文档
@Documented
/*

  • @Retention 有如下参数 (注解的生命周期)
  •     RetentionPolicy.SOURCE:注解被编译器丢弃
    
  •     RetentionPolicy.CLASS:注解保存在class类当中,被虚拟机忽略
    
  •     RetentionPolicy.RUNTIME:注解被保存在class类当中,被虚拟机读取
    
  • /
    @Retention(RetentionPolicy.RUNTIME)
    /
  • target 有如下参数:
  •     TYPE : 注解目标是类、接口
    
  •     FIELD: 注解目标是字段
    
  •     METHOD:注解目标是方法
    
  •     PARAMETER:注解目标是方法的参数
    
  •     CONSTRUCTOR:注解目标是构造函数
    
  •     LOCAL_VARIABLE:注解目标是局部变量
    
  • /
    @Target(value
    ={ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
    /
  • 可以被继承
    */
    @Inherited
    public @interface MyAnnotation {
    //设置注解成员变量并赋初始值
    String name() default "张三";
    int age() default 21;

}

读取注解信息

package com.pb.annotation.diy;

import java.lang.annotation.Annotation;

public class MyAnnotationTest {

@MyAnnotation(name</span>="Jack",age=32<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> getInfo(){
    
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取当前getInfo()方法中包含的所有注解</span>

@MyAnnotation
Annotation [] annos
=MyAnnotationTest.class.getMethod("getInfo").getAnnotations();
//注解数组
for (Annotation an : annos) {
if(an instanceof MyAnnotation){
System.out.println(
"an 是"+an);
System.out.println(
"注解中的 name:"+((MyAnnotation) an).name());
System.out.println(
"注解中的 age:"+((MyAnnotation) an).age());
}
}

    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span> (NoSuchMethodException |<span style="color: rgba(0, 0, 0, 1)"> SecurityException e) {
        e.printStackTrace();
    }
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    MyAnnotationTest mt</span>=<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MyAnnotationTest();
    mt.getInfo();
}

}