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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

男人都能有多浪漫?

1 如何对付有拖延症的朋友&#xff01;▼2 男人能有多浪漫&#xff1f;&#xff08;via.MOM南菁&#xff09;▼3 现实版&#xff1a;别说话吻我&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 注入了灵魂的神作&#xff01;&#xff08;素材来源网络…

InfoQ —— 腾讯游戏大数据服务场景与应用

简介 周东祥&#xff0c;本人从2010年毕业进入腾讯互动娱乐部门工作&#xff0c;一直致力在腾讯游戏运营开发工作。先后负责SAP业务受理系统&#xff0c;盗号自助系统&#xff0c;元数据系统以及近2年在腾讯游戏大数据运营开发中积累大量的大数据开发与应用经验。 介绍 数据采集…

美国人竟然花10年时间研究夫妻那些事!网上的那些传言竟然是真的......

全世界只有3.14 % 的人关注了爆炸吧知识恋爱变胖是真的爱你也是有一天超模君看到个新闻&#xff0c;某女网友在微博里发了一张秀恩爱照片&#xff0c;这次没有像往日一样收到柠檬精的艳羡&#xff0c;相反评论区一片静默。。。某女网友晒出老公四年的巨大变化图by微博一个阿呆仔…

Java常用的知识点就20_JAVA中一些需要记录的知识点

原标题&#xff1a;JAVA中一些需要记录的知识点的老师今天给大家讲java中一些重要的知识点。JDK与JRE的区别&#xff1a;JRE是所有JAVA程序运行所需要的环境&#xff0c;任何JAVA程序的运行都依赖于JRE&#xff0c;当前从JAVA官网选择安装JAVA即安装的是JRE。JDK是为开发人员所…

可以自发热的袜子,穿上暖3.9℃,这个冬天不再怕脚冷!

▲点击查看最近天气一天比一天冷&#xff0c;相信盆友们和小爆一样已经囤了不少保暖用品&#xff0c;秋衣秋裤棉拖鞋都安排好了&#xff01;等等&#xff0c;是不是有什么重要东西忘记了&#xff1f;平时出门&#xff0c;好像不穿棉拖鞋啊&#xff01;哎&#xff0c;还缺了一打…

QML的import目录爬坑记录

为什么80%的码农都做不了架构师&#xff1f;>>> 默认添加在.qrc文件里的同目录下qml文件&#xff0c;不需要添加import声明&#xff1b; 想导入自定义的组件&#xff1b; //只需要import到目录即可, //注意是qml组件文件所在的目录 import "./Dir" 但是…

收集css属性.

为什么80%的码农都做不了架构师&#xff1f;>>> body:before {content: "";position: fixed;top: -10px;left: 0;width: 100%;height: 10px;box-shadow: 0px 0px 10px rgba(0,0,0,.8);z-index: 100; } 浏览器头部阴影不支持ie .clearfix:after {clear: b…

mysql相交_MySQL相交

MySQL的相交INTERSECT运算符是SQL中的一种SET操作&#xff0c;包括UNION&#xff0c;UNION ALL&#xff0c;MINUS和INTERSECT。 INTERSECT运算符从两个或多个表中返回两组或公共记录中的不同(公共)元素。换句话说&#xff0c;它比较两个查询获得的结果并产生唯一的行&#xff0…

年轻人也太禁不起诱惑了吧?

1 好喝就够了&#xff01;▼2 为啥乌布雷纹了一个张译&#xff1f;&#xff01;▼3 美伢&#xff1a;小新&#xff0c;把我法宝拿来&#xff01;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 注入了灵魂的神作&#xff01;&#xff08;素材来源网络&#xff0c…

认清几种视频接口标准---无私奉献版

VGA&#xff0c;DVI和HDMI是三种视频传输标准&#xff0c;从而形成了以三种标准为基础的三种接口。所以他们是标准名称也是接口名称。在现在我们的计算机和电视设备上经常能见到。甚至有的显卡和显示器是三个接口共存的。大家对着三个名词并不陌生&#xff0c;尤其是VGA更是耳熟…

红黑树数据结构剖析

红黑树数据结构剖析红黑树是计算机科学内比较常用的一种数据结构&#xff0c;它使得对数据的搜索&#xff0c;插入和删除操作都能保持在O(lgn)的时间复杂度。然而&#xff0c;相比于一般的数据结构&#xff0c;红黑树的实现的难度有所增加。网络上关于红黑树的实现资料汗牛充栋…

python 多分类情感_python 文本情感分类

对于一个简单的文本情感分类来说&#xff0c;其实就是一个二分类&#xff0c;这篇博客主要讲述的是使用scikit-learn来做文本情感分类。分类主要分为两步&#xff1a;1)训练&#xff0c;主要根据训练集来学习分类模型的规则。2)分类&#xff0c;先用已知的测试集评估分类的准确…

.NET GC 实时监控工具 dotnet gcmon 介绍

今天介绍一个新的诊断工具 dotnet-gcmon, 也是全局 .NET CLI 工具, 它可以监控到 .NET 程序的 GC, 能获取到的信息也很详细, 另外 maoni 大佬也是其中的开发者之一。安装 gcmon和其他的 dotnet 诊断工具一样, 你可以使用以下命令&#xff0c;进行全局安装dotnet tool install -…

你绝对干过的15件傻事儿

全世界只有3.14 % 的人关注了爆炸吧知识首先来看你绝对干过的15件傻事儿&#xff0c;别不承认&#xff01;把树叶弄成这样喝酸奶舔盖子吃完棒冰继续含着棍子咬拉链尝试用笔写一首歌比如《生日快乐》对着电风扇说话或喊叫刮墙壁上的油漆过斑马线只踩白色部分猫打哈欠时伸手指进去…

java什么时候可能产生内存溢出_哪些场景会产生OOM?怎么解决?

Java技术栈www.javastack.cn关注阅读更多优质文章这个面试题是一个朋友在面试的时候碰到的&#xff0c;什么时候会抛出OutOfMemery异常呢&#xff1f;初看好像挺简单的&#xff0c;其实深究起来考察的是对整个JVM的了解&#xff0c;而且这个问题从网上可以翻到一些乱七八糟的答…

年仅53岁,因连续工作、过度劳累,这位抗疫幕后的科研专家去世

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;募格学术综合整理新华社、科技日报 记者 张佳星、长江日报-长江网据新华社报道&#xff0c;在抗击新冠肺炎疫情期间&#xff0c;因连续工作、过度劳累&#xff0c;中国医学科学院病原生物学研究所研究员赵振东教授因…

智能流控

关键应用太慢&#xff0c;带宽用不好&#xff1f;AppEx 智能流控帮你轻松搞定&#xff01; 现代企业和机构的运转越来越依赖网络的畅通。而网络应用的日益繁杂经常让有限的带宽难以招架。企业和机构经常面临的一个问题是员工上网流量导致网络出口拥塞&#xff0c;从而严重影响企…

vim相关

2019独角兽企业重金招聘Python工程师标准>>> 跟我一起学Vim http://feihu.me/blog/2014/intro-to-vim/ 浅显易懂 #Vim学习笔记 http://mturing.com/wiki/wikihtml/Vim%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.html Vim基本操作,排版不错 #简明Vim练级攻略 http://cool…

php生成vcf,详解PHP如何实现生成vcf vcard文件

PHP如何实现生成vcf vcard文件&#xff1f;本文主要介绍了PHP实现生成vcf vcard文件功能类定义与使用方法&#xff0c;结合具体实例形式分析了vcf vcard功能类的具体定义与使用方法&#xff0c;并附带VCardIFL.class.php类文件源码供读者下载参考。需要的朋友可以参考下&#x…

Github怎么删除之前的项目

Github怎么删除之前的项目 对于github的好奇,在上面新建了一个项目,如下图 我想把上面的项目删掉,但是发现找了很久没有找到删除的地方,我勒个插,后来终于找到地方了,首先,我们点击进去这个项目,然后看到settings如图, 点击进…