Java-注解知识、整理学习。

注解和注释

注解:说明程序的,给计算机看的

注释:用文字描述程序的,给程序员看的

注解的概念:

  注解(Annotation),也叫元数据。一种代码级别的说明。他是JDK1.5及以后版本引入的特性。与类、接口、枚举在同一个层次。他可以声明在包、类、字段、方法、局部变量、方法参数等前面,用来对这些元素进行说明、注释。

  ①jdk1.5之后出现的特性

  ②用来说明程序的

  ③使用方法:@注解名称

作用分类:

     ①编写文档:通过代码里标识的元数据生成文档【生成doc文档】

  ②代码分析:通过代码里标识的元数据对代码进行分析【使用反射】

  ③编译检查:通过代码里标识的元数据让编译器能够实现最基本的编译检查【如Override】    

Java内置的基本注解:

  • @Override:检测被该注解标注的方法是否是继承自父类(接口)的
  • @Deprecated:该注解标注的内容表示已过时
  • @SuppressWarnings:压制警告 一般传递参数“all”
  • @SafeVarargs:“堆污染”警告。
  • @FunctionalInterface:标注函数式接口,保证这个接口只有一个抽象方法,注意这个只能修饰接口

自定义注解:

  • 格式:
    • 元注解
    • public @interface 注解名称{
    •        属性列表
    • }
  • 本质:public interface MyAnno extends java.lang.annotation.Annotation{}    注解本质上就是一个接口,继承 java.lang.annotation.Annotation
  • 属性(接口中可以定义的内容(抽象方法,就是注解的属性))
    • 返回值类型      只有以下几种可以: 基本数据类型、String、枚举、注解、以上类型的数组,不能是void、类类型
    • 定义了属性,在使用时需要给属性赋值,如果不想给某个属性赋值,则在定义注解内方法的时候 加default xxx,如:
    • public @interface MyAnno{
          int age();
          String name() default "鲁班七号";        
      }
    • 如果只有一个属性需要赋值且这个属性名为value,则value=可以省略,如@MyAnno("鲁班七号")
    • 枚举赋值:@MyAnno(per=Person.P1)
    • 注解类型赋值:@MyAnno(anno=@Anno2)
    • 数组类型赋值:@MyAnno(strs={"a","b","c"})  数组赋值使用{}包裹。如果数组中只有一个值,则{}可以省略

元注解:用于描述注解的注解

@Target:描述注解能作用的位置 。 ElementType的取值:TYPE表示可以作用于类上;METHOD:可以作用于方法上;FIELD:可以作用于成员变量上

  @Target(value={ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})    表示该注解可以作用于类上、方法上、成员变量上

@Retention:描述注解被保留的阶段  

  RetentionPolicy.RUNTIME(该注解会保留到class字节码文件中,并且被JVM读取。一般取这个值),RetentionPolicy.CLASS(该注解会保留到class字节码文件中,但不会被JVM读取。),RetentionPolicy.SOURCE(不会保留到class字节码文件中)

@Documented:描述注解是否被抽取到api文档中

@Inherited:描述注解是否被子类继承

在程序中解析(使用)我们定义的注解

  获取注解中定义的属性值

  定义注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {
    String className();
    String methodName();
}

  

@Pro(className = "com.lhj.AnnoTest",methodName = "main")
public class AnnoTest {

    public static void main(String[] args) {
        //获取注解定义的位置对象(class、method、field)
       Class<AnnoTest> annClass=    AnnoTest.class;
       //获取指定注解
       Pro pro=    annClass.getAnnotation(Pro.class);
       //调用注解中的抽象方法获取配置的属性值
       String className=pro.className();
       String methodName=pro.methodName();
       System.out.println(className);
       System.out.println(methodName);
    }

}
原文地址:https://www.cnblogs.com/gyl5201314/p/13683889.html