2019独角兽企业重金招聘Python工程师标准>>>

java基础巩固笔记(6)-注解

标签: java


[TOC]


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

API

Package java.lang.annotation

注解的应用结构图

调用/结构关系:A<--B<--C

A,B,C解释如下:

A:注解类

@interface A{
}

B:应用了“注解类”的类

@A
Class B{
}

C:对“应用了注解类的类”进行反射操作的类

Class C{public void f(){B.class.isAnnotationPresent(A.class);A a = B.class.getAnnotion(A.class);}
}

元注解

元注解的作用就是负责注解其他注解。四个元注解分别是:@Target,@Retention,@Documented,@Inherited

  • @Retention

表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy中,包括RetentionPolicy.SOURCE,RetentionPolicy.CLASS(默认),RetentionPolicy.RUNTIME分别对应:java源文件-->class文件-->内存中的字节码

RetentionPolicy.SOURCE 注解将被编译器丢弃
RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
  • @Target

表示该注解用于什么地方,可能的值在枚举类ElemenetType中,包括

ElemenetType.CONSTRUCTOR 构造器声明
ElemenetType.FIELD 域声明(包括 enum 实例)
ElemenetType.LOCAL_VARIABLE 局部变量声明
ElemenetType.METHOD 方法声明
ElemenetType.PACKAGE 包声明
ElemenetType.PARAMETER 参数声明
ElemenetType.TYPE 类,接口(包括注解类型)或enum声明
  • @Documented

将此注解包含在javadoc中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当于@see,@param

  • @Inherited

允许子类继承父类中的注解

自定义注解

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

定义注解格式:

public @interface 注解名 {定义体}

注解参数的可支持数据类型:

1.所有基本数据类型(int,float,boolean,byte,double,char,long,short) 2.String类型 3.Class类型 4.enum类型 5.Annotation类型 6.以上所有类型的数组

示例代码

参考文末的【参考资料】中《java 注解的几大作用及使用方法详解(完)》

下面的示例,是上文提到的A<--B<--C的扩充版本。自定义了一个注解@A,然后在B类中使用了注解@A,最后在类C中利用反射读取@A中的信息

  • A.java
package com.iot.annotation;import java.lang.annotation.*;/*** Created by brian on 2016/2/20.*/
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface A {String name();int id() default 0;Class<Long> gid();
}
  • B.java
package com.iot.annotation;import java.util.HashMap;
import java.util.Map;/*** Created by brian on 2016/2/20.*/
@A(name="type",gid=Long.class)//类注解
public class B {@A(name="param",id=1,gid=Long.class) //类成员注解private Integer age;@A(name="construct",id=2,gid=Long.class) //构造方法注解public B(){}@A(name="public method",id=3,gid=Long.class) //类方法注解public void a(){}@A(name="protected method",id=4,gid=Long.class) //类方法注解protected void b(){Map<String,String> m = new HashMap<String,String>(0);}@A(name="private method",id=5,gid=Long.class) //类方法注解private void c(){Map<String,String> m = new HashMap<String,String>(0);}public void b(Integer a){}
}
  • C.java
package com.iot.annotation;import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;/*** Created by brian on 2016/2/20.*/
public class C {/*** 简单打印出B类中所使用到的类注解* 该方法只打印了 Type 类型的注解* @throws ClassNotFoundException*/public static void parseTypeAnnotation() throws ClassNotFoundException{Class clazz = Class.forName("com.iot.annotation.B");Annotation[] annotations = clazz.getAnnotations();for(Annotation annotation :annotations){A a = (A)annotation;System.out.println("id = "+a.id()+" ;name = "+a.name()+" ;gid = "+a.gid());}}/*** 简单打印出B类中所使用到的方法注解* 该方法只打印了 Method 类型的注解*/public static void parseMethodAnnotation() {Method[] methods = B.class.getDeclaredMethods();for (Method method : methods) {/** 判断方法中是否有指定注解类型的注解*/boolean hasAnnotation = method.isAnnotationPresent(A.class);if (hasAnnotation) {/** 根据注解类型返回方法的指定类型注解*/A annotation = method.getAnnotation(A.class);System.out.println("method = " + method.getName()+ " ; id = " + annotation.id() + " ; description = "+ annotation.name() + "; gid= " + annotation.gid());}}}/*** 简单打印出B类中所使用到的方法注解* 该方法只打印了 Method 类型的注解*/public static void parseConstructAnnotation(){Constructor[] constructors = B.class.getConstructors();for (Constructor constructor : constructors) {/** 判断构造方法中是否有指定注解类型的注解*/boolean hasAnnotation = constructor.isAnnotationPresent(A.class);if (hasAnnotation) {/** 根据注解类型返回方法的指定类型注解*/A annotation =(A) constructor.getAnnotation(A.class);System.out.println("constructor = " + constructor.getName()+ " ; id = " + annotation.id() + " ; description = "+ annotation.name() + "; gid= "+annotation.gid());}}}public static void main(String[] args) throws ClassNotFoundException {parseTypeAnnotation();parseMethodAnnotation();parseConstructAnnotation();}}

参考资料

  • java 注解的几大作用及使用方法详解(完)
  • 另类的package-info.java文件探讨
  • 深入理解Java:注解(Annotation)自定义注解入门

作者@brianway更多文章:个人网站 | CSDN | oschina

转载于:https://my.oschina.net/brianway/blog/618037

java基础巩固笔记(6)-注解相关推荐

  1. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  2. 【Java基础学习笔记】- Day11 - 第四章 引用类型用法总结

    Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 4.1 class作为成员变量 4.2 interface作为成 ...

  3. java基础巩固笔记(5)-多线程之线程并发库

    2019独角兽企业重金招聘Python工程师标准>>> java基础巩固笔记(5)-多线程之线程并发库 标签: java [TOC] 本文主要概述java.util.concurre ...

  4. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  5. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  6. Java基础知识笔记-11_2-Swing用户界面组件

    Java基础知识笔记-11_2-Swing用户界面组件 这章教程两个版本,一个语法是非lambda表达式版本,另一个是lambda表达式版本 非lambda表达式版本 1 Java Swing概述 J ...

  7. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

  8. 51自学网-Java基础视频教程-笔记 最后修改于2020/9/9

    Java基础视频教程笔记 简介 正文 ==JVM Java Virtual Machine== 栈区 Stack Segment 堆区 Heap Segment 静态区 Data Segment 代码 ...

  9. Java基础入门笔记2

    Java基础入门笔记2 一. 为什么把程序出错叫做"BUG"? 1. 原因是臭虫或者虫子,现在用来指代电脑系统或者程序中隐藏的一些漏洞或者一些问题,所以现在程序出问题就叫" ...

最新文章

  1. (详细讲解)配置Pycharm连接服务器跑本地代码
  2. SAP Spartacus Multi-Site Configuration
  3. hdu1873 看病要排队-优先队列
  4. jwt重放攻击_4个点搞懂JWT、JWS、JWE
  5. 最帅的我救了两条很丑的狗
  6. Android,谁动了我的内存
  7. C# Socket简单例子(服务器与客户端通信)
  8. 4月1日起支付宝、微信扫码支付单日限额500元,够用吗?
  9. word行首空格下划线_word空格处加下划线 word空格处下划线
  10. mysql数据的查寻练习
  11. 色彩构成与搭配——人对色彩的感觉
  12. 软件中存在的技术风险
  13. 矩阵求导——Numerator Layout Denominator Layout
  14. 【VUE】浏览器消息通知(声音提醒,标题栏闪动,弹框提醒)
  15. u盘打开提示格式化怎么办?有用的方法来了
  16. 如何禁用手机自带的输入法软键盘
  17. edge使用html2协议,Legacy Microsoft Edge developer documentation
  18. protobuf repeated数组类型的使用
  19. Flask框架项目部署:阿里云CentOS操作系统
  20. 随遇而安 - {阿猫阿狗的幸福生活系列} [二]

热门文章

  1. 这些 JS 中强大的操作符,总有几个你没听说过
  2. Ubuntu 16.04/CentOS 6.9安装Apache压力(并发)测试工具ab
  3. HDU 4085 Steiner树模板称号
  4. 第二天:装饰模式及面向对象设计原则4则
  5. 世界十大无法科学解释灵异事件(进来发表自己看发)
  6. CCNA,CCNP资料
  7. char data[0]在struct末尾的用法
  8. java小基础之instanceof运算符
  9. #CSS# 初识CSS
  10. ExtJs 4.x Ajax简单封装