java注解详解

1 什么是JAVA注解

  • java注解又叫java标注,是jdk1.5引入的一种注释机制;
  • java语言的类、方法、属性、参数、包都可以被标注,与javadoc不同,java的注解,在编译时候可以嵌入到字节码文件中,注解可以被JVM虚拟机可以保存,被JVM虚拟机读取。

2 JAVA注解的分类

  • java内置注解一个有10个

2.1 代码注解

标注在代码里面的注解,称为代码注解

注解 描述
override 标记在子类中重写了父类的方法,如果不是则会报错
deprecated 标记此方法已经过时了
suppressWarnings 忽略注解声明的警告

2.2 元注解

  • 元注解可以理解为注解的注解(如果不能理解可以去看下元数据)
注解 描述
retention 标记注解怎么保存
documented 使用此注解可以让注解保存到javadoc文档中
target 标记注解的作用域
Inherirted 标记注解有继承性

2.3 新增的注解

注解 描述
SafavarArgs 忽略方法或者构造方法的参数为泛型所产生的警告
FuntionalInterface 标注一个函数性接口
repeatable 标识某注解可以在同一个声明上使用多次

3 JAVA注解三大类

  • 每一个annotation都有多个elementType和唯一的一个retentionPolicy(可能这个大家不是很理解,往下看)

3.1 Annotation接口

package java.lang.annotation;
public interface Annotation {

    boolean equals(Object obj);

    int hashCode();

    String toString();

    Class<? extends Annotation> annotationType();
}

3.2 ElementType枚举

public enum ElementType {
    TYPE, //在接口、类、枚举上声明注解
    METHOD,//在方法上声明注解
    FIELD,//在字段上声明注解
    PARAMETER,//在参数上声明注解
    LOCAL_VARIABLE,//在局部变量上声明注解
    PACKET,在包上声明注解
    CONSTRUCTOR,//在构造方法上声明注解
    ANNOTATIONTYPE,//在注解类型上声明注解
}

3.3 RtentionPolicy枚举

public enum RtentionPolicy {
    SOURCE,         //注解信息存在代码的编译过程,编译结束,注解结束
    CLASS,          //注解信息保存在字节码文件中
    RUNTIME         //注解信息保存在字节码文件中,并可以被JVM虚拟机读取
}

4 举例SuppressWarnings详解

@Doucumented
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}
  • @Doucumented代表的是SuppressWarnings注解可以保存javadoc文档里面的
  • @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) 表示的是该注解可以作用域。
  • @Retention(RetentionPolicy.SOURCE) 表示注解仅仅在存在编译期间,编译结束则消失
  • String[] value();表示SuppressWarnings 有多个值;
    SuppressWarnings的常用关键字
关键字 描述
deprecation 忽略使用不被赞成、过时所产生的警告
unchecked 忽略集合中没有声明类型的所产生的警告
fallthrouth switch程序块,忽略下一种情况没有break的情况
path 忽略类地址、源路径不存在的警告
serial 序列化的时候,忽略类中缺少serialVersionUUid警告
finally 忽略finally语句块不能正常执行的的警告
all 忽略以上所有的警告

示例1
注释前产生的警告
java注解详解_第1张图片
注释后忽略此警告
java注解详解_第2张图片

示例2
注释前产生的警告
java注解详解_第3张图片
注释后忽略此警告
java注解详解_第4张图片

5 举例Inherited详解

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

  • @Doucumented代表的是Inherited注解可以保存javadoc文档里面的
  • @Target(ElementType.ANNOTATION_TYPE) 表示的是该注解可以作用域是annotation。
  • @Retention(RetentionPolicy.RUNTIME)表示注解保存在class文件中,并可以被JVM虚拟机读取
  • 被Inherited 注解的注解具有继承性
    示例1不被Inherited 修饰的注解
    1、编写一个注解
package reflect;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

//@Inherited
@Documented
@Retention(RUNTIME)
@Target({TYPE,FIELD,METHOD})
public @interface AnnnotationOne {
}

2、编写一个父类

package reflect;

@AnnnotationOne
public class Person {
}

3、编写一个子类

package reflect;

public class Teacher extends Person {
    public static void main(String[] args) {
        Class<Teacher> teacherClass = Teacher.class;
        boolean annotationPresent = teacherClass.isAnnotationPresent(AnnnotationOne.class);
        System.out.println(annotationPresent);
    }
   
}

响应
在这里插入图片描述
示例2被Inherited 修饰的注解
1、编写一个注解

package reflect;

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

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Inherited
@Documented
@Retention(RUNTIME)
@Target({TYPE,FIELD,METHOD})
public @interface AnnnotationOne {
}

2、编写一个父类

package reflect;

@AnnnotationOne
public class Person {


}

3、编写一个子类

package reflect;

public class Teacher extends Person {
    public static void main(String[] args) {
        Class<Teacher> teacherClass = Teacher.class;
        boolean annotationPresent = teacherClass.isAnnotationPresent(AnnnotationOne.class);
        System.out.println(annotationPresent);


    }
    
}

在这里插入图片描述

  • 从2个示例可以看出被注解Inherirte标注的注解具有继承性。

6 反射注解

package reflect;

import java.lang.annotation.Annotation;

public class Teacher extends Person {
    public static void main(String[] args) {
        //获取Teacher的class对象
        Class<Teacher> teacherClass = Teacher.class;
        //获取父类的class对象
         Class<? super Teacher> superclass = teacherClass.getSuperclass();
         //获取指定的注释对象
        AnnnotationOne Annotation = superclass.getAnnotation(AnnnotationOne.class);
        //获取注解的值
        String[] value = Annotation.value();
        for (String a :value){
            System.out.println(a);
        }

        System.out.println("=================================");
        Annotation[] annotations = superclass.getAnnotations();
        for (Annotation annotation:annotations){
            System.out.println(annotation);
        }



    }
    
}

在这里插入图片描述

你可能感兴趣的:(java,开发语言)