博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Annotation 前言
阅读量:6735 次
发布时间:2019-06-25

本文共 3246 字,大约阅读时间需要 10 分钟。

hot3.png

Java注解是JSR 250的规范,在jdk1.5版本之后引入。

Java注解

Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。

元数据的作用

如果要对于元数据的作用进行分类,还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:

编写文档:通过代码里标识的元数据生成文档。

代码分析:通过代码里标识的元数据对代码进行分析。

编译检查:通过代码里标识的元数据让能实现基本的编译检查

注解的高级应用

限制注解的使用范围

用@Target指定ElementType属性

public enum ElementType {    // 用于类,接口,枚举但不能是注解    TYPE,    // 字段上,包括枚举值    FIELD,    // 方法,不包括构造方法    METHOD,    // 方法的参数    PARAMETER,    // 构造方法    CONSTRUCTOR,    // 本地变量或catch语句    LOCAL_VARIABLE,    // 注解类型(无数据)    ANNOTATION_TYPE,    // Java包    PACKAGE}

举例:

// 限制注解使用范围@Target({ElementType.METHOD,ElementType.CONSTRUCTOR})public @interface Greeting {    // 使用枚举类型    public enum FontColor {        BLUE,RED,GREEN    };    String name();    FontColor fontColor() default FontColor.RED;}

注解保持性策略

在Java编译时,它会识别在里添加的注解是否还会保留,这就是RetentionPolicy。下面是Java定义的RetentionPolicy枚举:

public enum RetentionPolicy {    // 此类型会被编译器丢弃    SOURCE,    // 此类型注解会保留在class文件中,但JVM会忽略它    CLASS,    // 此类型注解会保留在class文件中,JVM会读取它    RUNTIME}

编译器的处理有三种策略:

将注解保留在编译后的类文件中,并在第一次加载类时读取它;

将注解保留在编译后的类文件中,但是在运行时忽略它;

按照规定使用注解,但是并不将它保留到编译后的类文件中。

// 让保持性策略为运行时态,即将注解编码到class文件中,让虚拟机读取@Retention(RetentionPolicy.RUNTIME)public @interface Greeting {    // 使用枚举类型    public enum FontColor {        BLUE,RED,GREEN    };    String name();    FontColor fontColor() default FontColor.RED;}

文档化功能

Java提供的Documented元注解跟Javadoc的作用是差不多的,其实它存在的好处是开发人员可以定制Javadoc不支持的文档属性,并在开发中应用。它的使用跟前两个也是一样的,简单代码示例如下:

// 让它定制文档化功能// 使用此注解时必须设置RetentionPolicy为RUNTIME@Documentedpublic @interface Greeting {    // 使用枚举类型    public enum FontColor {        BLUE,RED,GREEN    };    String name();    FontColor fontColor() default FontColor.RED;}

标注继承

// 让它允许继承,可作用到子类@Inheritedpublic @interface Greeting {    // 使用枚举类型    public enum FontColor {        BLUE,RED,GREEN    };    String name();    FontColor fontColor() default FontColor.RED;}

读取注解信息的方法

属于重点,在系统中用到注解权限时非常有用,可以精确控制权限的粒度

注意:要想使用反射去读取注解,必须将Retention的值选为Runtime

import java.lang.annotation.Annotation;import java.lang.reflect.Method; //读取注解信息public class ReadAnnotationInfoTest {    public static void main(String[] args) throws Exception {        // 测试AnnotationTest类,得到此类的类对象        Class c = Class.forName("com.iwtxokhtd.annotation.AnnotationTest");        // 获取该类所有声明的方法        Method[] methods = c.getDeclaredMethods();        // 声明注解集合        Annotation[] annotations;        // 遍历所有的方法得到各方法上面的注解信息        for (Method method : methods) {            // 获取每个方法上面所声明的所有注解信息            annotations = method.getDeclaredAnnotations();            // 再遍历所有的注解,打印其基本信息            System.out.println(method.getName());            for (Annotation an : annotations) {                System.out.println("方法名为:" + method.getName() + "其上面的注解为:" + an.annotationType().getSimpleName());                Method[] meths = an.annotationType().getDeclaredMethods();                // 遍历每个注解的所有变量                for (Method meth : meths) {                    System.out.println("注解的变量名为:" + meth.getName());                }            }        }    }}

 

转载于:https://my.oschina.net/u/2433960/blog/889702

你可能感兴趣的文章
Tablayout ViewPage 使用示例
查看>>
linux下面MySQL变量修改及生效
查看>>
Android 6.0 如何默认打开user版本的root权限【转】
查看>>
TP框架在做上传时候提示:没有上传的文件!
查看>>
leetcode 485. Max Consecutive Ones
查看>>
IDEA使用笔记(九)——设置文件注释
查看>>
漫谈Java IO之基础篇
查看>>
CentOS 6.8 防火墙配置
查看>>
Spring Boot 2.0 整合 FreeMarker 模板引擎
查看>>
Java 知识点
查看>>
Nginx+Tomcat高性能负载均衡集群搭建
查看>>
BZOJ3573: [Hnoi2014]米特运输(树上乱搞)
查看>>
Dubbo的一些编码约定和设计原则
查看>>
IDA 操作记录
查看>>
告警系统需求分析 告警系统主脚本 告警系统配置文件 告警系统监控项目
查看>>
JavaServer Faces (JSF) with Spring
查看>>
知物由学 | 这些企业大佬如何看待2018年的安全形势?
查看>>
[转]Mongodb的下载和安装
查看>>
usb_submit_urb
查看>>
[Node.js] Add Logging to a Node.js Application using Winston
查看>>