Java Annotation 笔记

原文:https://www.jianshu.com/p/596d389282a0

对Java中的注解进行了详细的讲解,还包括解析注解,自定义注解等

阅读笔记

一.元数据

1.元数据的概念:

元数据是关于数据的数据。在编程语言的上下问中,元数据是添加到程序的元素如方法、字段、类和包上的额外信息。对数据进行说明描述的数据。

也就是说元数据就是对代码的说明信息,也就是注解中的信息。

2.元数据的作用:

一般来说,元数据有三种功能

第一:创建文档

第二:分析代码

第三:编译检查

 

二.注解

1.注解的概念:

注解(Annotation)是JDK1.5之后增加的新特性,目前很多框架中也大量用到了注解,比如Hibernate、Spring相关的框架。

注意:Annotation能被用来为程序元素(类,方法,成员变量等)设置元数据。Annotation不影响程序代码的执行,无论增加、删除Annotation,代码都始终如一的执行。如果希望让程序中的Annotation起一定作用,只能通过解析工具或者编译工具对Annotation中的信息进行解析和处理。

2.内建注解:(实现了编译检查)

Java提供了多种内建的注解,下面说几个比较常用的注解:

@Override(标记此方法是重写方法)

@Deprecate(表示此方法已经过时,标记成这样的方法不建议使用)

@SuppressWarnings(表示通过编译器忽略某些警告,可以通过value来写明要忽略那些警告)

   例如@SuppressWarnings(value={“uncheck”,“deprecation”})

   常用参数及其含义:

   deprecation:使用了过时的类或者方法时的警告

   unchecked:执行了未检查的转换时的警告

   fallthrough:当Switch程序块进入下一个case而没有break时的警告

   path:在类路径、源文件路径等有不存在路径时的警告

   serial:当可序列化的类缺少serialVersionUID定义时的警告

   finally:任意finally子句不能正常完成时的警告

   all:以上所有的警告

@Functionallnterface(表示通知编译器检查当前接口是不是函数式接口,就是只能有一个抽象方法,否则报错)

3.元Annotation

当一个接口直接继承java.lang.annotation.Annotation接口时,仍是接口,而并非注解。

要想自定义注解类型,只能通过@interface关键字的方式,其实通过该方法会隐式的继承Annotation接口。

@Documented:用户指定被@Documented修饰的Annotation类将会被javadoc工具提取成文档,如果定义Annotation类时使用了@Documented修饰,则所有使用该Annotation修饰的程序元素的API文档中会包含该Annotation说明。

这就实现了元数据的一个重要的功能,编写文档。

@Inherited指定被它修饰的Annotation将具有继承性,如果某一个类使用了@XXX注解,同时使用@Inherited,则其子类将自动被@XXX修饰。

@Retention:表示注解的保留时长。没有使用这个的注解,则使用默认策略(RepentionPolicy.CLASS),以下是三种策略:

SOURCE:仅仅存在于java源文件中,编译时会丢弃

CLASS:存在于java源文件和编译后生成的class文件中,但是在JVM中不会保留

RUNTIME:存在源文件,class文件,JVM编译过程中,可以使用反射技术读取注解。

@Target:用@Target修饰的注解表示注解的使用范围。没有声明@Target的注解,默认适用于所有的程序元素,关于程序元素(ElementType)是枚举类型,8种:

ANNOTATION_TYPE:注解类型声明

CONSTRUCTOR:构造方法声明

FIELD:字段声明

LOCAL_VARIABLE:局部变量声明

METHOD:方法声明

PACKAGE:包声明

PARAMETER:参数声明

TYPE:类、接口、枚举声明

三.自定义注解

例如:

@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
    String name();
    String website() default "hello";
    int revision() default 1;
}

自定义注解中的规则:

注解方法可以不带参数

注解方法可以有默认值,使用default+默认值的格式

当然注解中也可以不存在成员变量,在使用解析注解进行操作时,仅以是否包含该注解来进行操作。当注解中有成员变量时,如没有默认值,需要在使用注解时,指定成员变量的值。

由于该注解的保留策略为RetentionPolicy.RUNTIME,所以可以在运行期间通过反射机制来使用,否则无法通过反射机制来获取。这时候注解实现的就是元数据的第二个作用:代码分析

四.注解解析

接下来,通过反射技术来解析自定义注解。关于反射类位于包java.lang.reflect,其中有一个接口AnnotationElement,该接口主要有如下实现类:Class,Constructor,Field,Method,Package。以及下面提出的核心方法:

getAnnotation(Class annotationClass)当存在该元素指定类型注解,则返回相应注释,否则返回null

getAnnotations()返回此元素上存在的所有的注解

getDelaredAnnotation()返回直接存在于此元素上的所有的注解

isAnnotationPresent(Class<? extends Annotation> annotationClass)当存在该元素的指定类型注解,则返回true,否则返回false

public class AnnotationParser {
    public static void main(String[] args) throws SecurityException, ClassNotFoundException {
        String clazz = "com.lvr.annotation.AnnotationDemo";
        Method[]  demoMethod = AnnotationParser.class
                .getClassLoader().loadClass(clazz).getMethods();

        for (Method method : demoMethod) {
            if (method.isAnnotationPresent(MyAnnotataion.class)) {
                 MyAnnotataion annotationInfo = method.getAnnotation(MyAnnotataion.class);
                 System.out.println("method: "+ method);
                 System.out.println("name= "+ annotationInfo.name() +
                         " , website= "+ annotationInfo.website()
                        + " , revision= "+annotationInfo.revision());
            }
        }
    }
}

 

posted @   胡鹏飞  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示