栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java注解详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 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忽略集合中没有声明类型的所产生的警告
fallthrouthswitch程序块,忽略下一种情况没有break的情况
path忽略类地址、源路径不存在的警告
serial序列化的时候,忽略类中缺少serialVersionUUid警告
finally忽略finally语句块不能正常执行的的警告
all忽略以上所有的警告

示例1
注释前产生的警告

注释后忽略此警告

示例2
注释前产生的警告

注释后忽略此警告

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 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 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 teacherClass = Teacher.class;
        //获取父类的class对象
         Class 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);
        }



    }
    
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1010016.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号