Java注解

Java注解初步

文章目录

  • Java注解初步
    • 1、注解介绍
      • 1.1 注解作用
      • 1.2 常用Java内置注解
      • 1.3注解分类
    • 2、元注解
      • 2.1概述--注解的注解
      • 2.2常用元注解
    • 3、自定义注解

1、注解介绍

注解Annotation,JDK5.0之后引入的特性。

用于描述元数据的修饰符,包括类、成员变量、构造方法、方法参数、以及包声明等的信息的元数据。

格式:@注解名

例如:

class Father {
    public void show(){
        System.out.println("Father show");
    }
}
class Son extends Father{
    @Override
    public void show(){
        System.out.println("Son show");
    }
}

1.1 注解作用

  • 执行编译时进行格式检查
  • 跟踪代码依赖性
  • 代替配置文件,简易配置环境

1.2 常用Java内置注解

  • @Override,如上例,标记指定方法是一个重写方法,若没有重写,则会报错

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Override {
    }
    
  • @SupressWarnings,放置在类和方法上,作用是阻止编译器发出某些警告信息。

    @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface SuppressWarnings {
        String[] value();
    }
    

    它可以阻止的警告类型(value)如下:

    • unchecked 未检查的转化,如集合没有指定类型还添加元素
    • unused 未使用的变量
    • resource 有泛型未指定类型
    • path 在类路径,原文件路径中有不存在的路径
    • deprecation 使用了某些不赞成使用的类和方法
    • fallthrough switch语句执行到底没有break关键字
    • rawtypes 没有写泛型,比如: List list = new ArrayList();
    • all 全部类型的警告

示例:

import java.util.ArrayList;
import java.util.List;
//@SuppressWarnings( "all"),压制所有警告
public class Demo01 {
    public static void main(String[] args) {
        //@SuppressWarnings("unused")
        int num = 1;//num没有用过,会报未使用警告,使用上面的方式可去除警告
        //@SuppressWarnings(value = {"rawtypes","unused"})
        List list = new ArrayList();
    }
}
  • @Deprecated ,用于标记当前类、成员变量、成员方法或者构造方法过时,如果开发者调用了被标记为过时的 方法,编译器在编译期进行警告。

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
    public @interface Deprecated {
    }
    
    • 示例:
    public class Demo02 {
        public static void main(String[] args) {
            //@Deprecated : 标记一个类、方法、变量,是过时!!!
            Son son = new Son();
            son.method01();
            System.out.println(son.num);
        }
    }
    class Son {
        @Deprecated
        public int num = 1;
        @Deprecated
        public void method01(){
            System.out.println("Son method01");
        }
    }
    

在这里插入图片描述

1.3注解分类

  • 标记注解

    • 没有参数的注解,
    • 如@Override、Deprecated
  • 单值注解

    • 注解中只有一个参数
    • 如@SuppressWarnings
  • 完整注解

    • 注解中有多个属性

2、元注解

2.1概述–注解的注解

作用在自定义注解上,规定自定义注解的作用区域存活策略

格式:@interface 注解名

2.2常用元注解

  • @Target
    • 描述注解的作用范围
    • 用来说明被它注解的注解可修饰的范围,如修饰类、成员变量、成员方法等
public @interface Target {
    ElementType[] value();
}
public enum ElementType {
    TYPE,//类、接口、注解、枚举
    FIELD,//成员变量
    METHOD,//成员方法
    PARAMETER,//形参
    CONSTRUCTOR,//构造器
    LOCAL_VARIABLE,//局部变量
    ANNOTATION_TYPE,//注解类型
    PACKAGE,//包
    TYPE_PARAMETER,//类型参数,JDK 1.8 新增
    TYPE_USE//使用类型的地方,JDK 1.8 新增
}
  • @Retention
    • 规定自定义注解的存活策略
public @interface Retention {
    RetentionPolicy value();
}
public enum RetentionPolicy {
    SOURCE,//仅存活在源码
    CLASS,//存活在编译期
    RUNTIME//存活在运行时
}
  • @Documented注解
    • 描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。
public @interface Documented { }

示例:

  • 首先创建一个自定义注解MyAnnotation,被@Documented注解所修饰
  • 再创建一个测试类被自定义注解MyAnnotation修饰
  • 在CMD命令里对该测试类操作:
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
/**
 * 自定义注解MyAnnotation
 */
@Documented
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface MyAnnotation {
    public String value() default "这是@Documented注解为文档添加的注释";
}
@MyAnnotation()
public class Test {
    @Override
    @MyAnnotation
    public String toString() {
        return this.toString();
    }
}

Java注解_第1张图片
命令执行完之后,会在当前目录下生成一个doc文件夹
Java注解_第2张图片
包含如下内容:
Java注解_第3张图片打开index.html
Java注解_第4张图片

生成的是帮助文档,会显示MyAnnotation注解。在MyAnnotation中去掉@Documented,在帮助文档中不会显示该注释。

  • @Inherited注解
    • 使被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解)

3、自定义注解

自定义注解格式

@Retention(RetentionPolicy.RUNTIME)
public @interface 注解名 {
    数据类型 属性名1() default 默认值1;//default可省略
    数据类型 属性名2() ;
    数据类型[] 属性名3() default {1,2,...};
}

示例:

/**
 * 自定义注解MyAnnotation01
 */
public @interface MyAnnotation01 {
    String username() default "root";
    String password() default "root123";
    String[] course default {"软件测试","软件工程"} 
    String value();
}

注意:只有value属性没有默认值并单独使用时可以省略“value = ”,如:

@MyAnnotation01("hello_world")

你可能感兴趣的:(java)