关于注解你需要知道的

发布时间:2021-09-24 13:09:49


转载请标明出处:
http://blog.csdn.net/guangzq/article/details/74644624
本文出自祝起光的博客



什么是注解

注解是 Java 5 的一个新特性。注解是插入你代码中的一种注释或者说是一种元数据(meta data)。这些注解信息可以在编译期使用预编译工具进行处理(pre-compiler tools),也可以在运行期使用 Java 反射机*写怼U饫锎嬖谧乓桓龌镜墓嬖颍Annotation不能影响程序代码的执行,无论增加、删除 Annotation,代码都始终如一的执行。注解的行为就像


系统内置标准注解:

注解的语法比较简单,除了@符号的使用外,他基本与Java固有的语法一致,JavaSE中内置三个标准注解,定义在java.lang中:


@Override:用于修饰此方法覆盖了父类的方法; @Deprecated:用于修饰已经过时的方法;@SuppressWarnnings:用于通知java编译器禁止特定的编译警告。
元注解

元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:


@Target,@Retention,@Documented,@Inherited

下面一一说一下每个元注解的参数使用和作用


@Target

@Target注解的作用目标。说明了注解所修饰的对象范围,可以更加清晰注解所修饰的目标。


作用:描述注解的使用范围,即注解用在什么地方


ElementType取值作用目标
@Target(ElementType.ANNOTATION_TYPE)注解,就是用于描述注解本身
@Target(ElementType.CONSTRUCTOR)描述构造函数
@Target(ElementType.FIELD)字段(成员变量)、枚举的常量
@Target(ElementType.LOCAL_VARIABLE)局部变量
@Target(ElementType.METHOD)方法
@Target(ElementType.PACKAGE)
@Target(ElementType.PARAMETER)方法参数
@Target(ElementType.TYPE)类、接口(包括注解类型) 或enum声明

举例:


@Target(ElementType.METHOD)
public @interface MethodAnnotation {
String value() default "";
}

@Target(ElementType.FIELD)
public @interface FieldAnnotation {
String value() default "";
}

注解MethodAnnotation可以用来描述方法,FieldAnnotation可以用来描述字段、枚举的常量。


@Retention

@Retention定义了该注解的时间长短,即注解的生命周期。


作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)


ElementType取值作用目标
@Retention(RetentionPolicy.SOURCE)在源文件中有效(即源文件保留)
@Retention(RetentionPolicy.CLASS)在class文件中有效(即class保留)
@Retention(RetentionPolicy.RUNTIME)在运行时有效(即运行时保留)

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Person {
public String name() default "fieldName";
public String sex() default "fieldSex";
}

Person注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理


@Documented

@Documented将此注解包含在Javadoc中。用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如Javadoc此类的工具文档化。Documented是一个标记注解,没有成员。


@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Person {
public String name() default "fieldName";
public String sex() default "fieldSex";
}

@Inherited

允许子类继承父类中的注解。使用很少。


自定义注解

@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。


定义注解格式:


public @interface 注解名 {定义体}
 
举例:


@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RapperName {
String value() default "";
}

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


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

Annotation类型里面的参数该怎么设定:


第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;   第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;  第三,如果只有一个参数成员,最好把参数名称设为”value”,后加小括号.

下面用一个自定义注解的例子来说明一下使用:



最*《中国有嘻哈》挺火,那我们就让rapper吴亦凡来dis一句 “你有freestyle吗?”



/**
* Created by zhuqiguang on 17/7/6.
* rapper名字
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RapperName {
String value() default "";
}

是哪里的rapper呢?


/**
* Created by zhuqiguang on 17/7/6.
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface RapperAdress {
//住址枚举
enum Adress{SICHUAN, BEIJING, SHANDONG}
//住址属性
Adress rapperAdress() default Adress.BEIJING;
}

rapper需要嘻哈装备


/**
* Created by zhuqiguang on 17/7/6.
*/
public @interface RapperEquipment {
//语言选项
enum Language{CHINESE, ENGLISH}
//语言属性
Language rapperLanguage() default Language.CHINESE;

//说唱歌词
String rapperLyrics() default "";
//穿戴选项
enum Clothing{GLASSES, RING}
Clothing rapperClothing() default Clothing.GLASSES;
}

组合成一个rapper


/**
* Created by zhuqiguang on 17/7/6.
*/
public class Rapper {
@RapperName("吴亦凡")
private String rapperName;
@RapperAdress(rapperAdress = RapperAdress.Adress.BEIJING)
private String rapperAdress;
@RapperEquipment(rapperLanguage = RapperEquipment.Language.CHINESE, rapperLyrics = "你有free style吗?", rapperClothing = RapperEquipment.Clothing.GLASSES)
private String rapperEquipment;

public String getRapperName() {
return rapperName;
}

public void setRapperName(String rapperName) {
this.rapperName = rapperName;
}

public String getRapperAdress() {
return rapperAdress;
}

public void setRapperAdress(String rapperAdress) {
this.rapperAdress = rapperAdress;
}

public String getRapperEquipment() {
return rapperEquipment;
}

public void setRapperEquipment(String rapperEquipment) {
this.rapperEquipment = rapperEquipment;
}
}

利用反射来获取rapper字段


/**
* Created by zhuqiguang on 17/7/6.
*/
public class RapperUtils {
private static String Tag = "RapperUtils";

public static void getRapperInfo (Class clazz){
String rapperName = "rapper名字: ";
String rapperAdress = "rapper住址: ";
String rapperEquipment = "rapper装备: ";
Field[] declaredFields = clazz.getDeclaredFields();
for(Field field: declaredFields) {
if (field.isAnnotationPresent(RapperName.class)) {
RapperName name = field.getAnnotation(RapperName.class);
Log.d(Tag, rapperName + name.value());
}else if (field.isAnnotationPresent(RapperAdress.class)) {
RapperAdress adress = field.getAnnotation(RapperAdress.class);
Log.d(Tag, rapperAdress + adress.rapperAdress().toString());
}else if (field.isAnnotationPresent(RapperEquipment.class)) {
RapperEquipment equipment = field.getAnnotation(RapperEquipment.class);
String equ = "语言: " + equipment.rapperLanguage().toString() + " ,歌词: " + equipment.rapperLyrics() + " ,穿戴: " + equipment.rapperClothing().toString();
Log.d(Tag, rapperEquipment + equ);
}
}
}
}

main函数中调用


RapperUtils.getRapperInfo(Rapper.class);

输出结果:


rapper住址: BEIJING
rapper装备: 语言: CHINESE ,歌词: 你有free style吗? ,穿戴: GLASSES
rapper名字: 吴亦凡

总结

注解在对于框架的构建以及简约代码有很大的作用,像Android中的通讯组件Router就是利用注解来设置通讯的路径,还有著名的Butternife,其原理是ButterKnifeProcessor在编译时会扫描你的Java代码中所有使用@BindView,@OnClick等注解,如果发现存在注解,那么通过一系列的解析工作,生成一个类似AnnotationActivity## ViewBinder(className##ViewBinder)的Java类,这个类实现了ViewBinder接口。这个生成类中实现了各注解对应的代码像@BindView最终会执行findViewById(),@OnClick最终会执行setOnClickListener()


本文demo中的源码地址:


https://github.com/guangzq/AnnotationDemo.git
参考

http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html

相关文档

  • 手机系统更新失败开不了机怎么办
  • 怎么调理内分泌失调
  • 党办主任述职报告范文
  • Visual Studio Code汉化最详细图文教程
  • 车间电工班班长协理试用期的工作测评汇总
  • 为什么饭店炒出来的青菜翠绿可口,原来是里面加了它,怪不得好吃!
  • 百度联盟高收益作弊手法【3】:利用移动端赚钱更快更安全
  • 计算机图形学(一)
  • 土建项目工程建设施工技术管理
  • 日本是一个什么样的民族
  • 文字作品使用许可使用合同
  • 苹果手机支持5G吗苹果手机支持不支持5G
  • 计算机网络-详解DNS域名解析全过程
  • 社区全年党建工作汇报
  • Linux系统Firewalld基本使用
  • 适合年轻人创业的小本投资好项目
  • 新闻专业大学生实习计划书范文
  • 热血江湖结婚怎么出去
  • 软件开发的共享空间
  • 甘蔗正确的施肥方法详细介绍
  • 沈阳劳动合同范本
  • 《白鼻??银鞍白鼻?》翻译赏析
  • 云南的歌会阅读题答案解析
  • 家纺创业计划书
  • 保护环境的名人名言
  • 婚礼策划方案优选10篇
  • 巨蟹座女生和水瓶座男生配对这么样
  • 幼儿园中班教案《伦敦桥》
  • github issue 搜索_开发一个简单的工具,导出github仓库所有issue列表
  • 绝情的句子说说心情
  • 猜你喜欢

  • 济南市小学科学课堂教学指导意见
  • 中国对外贸易自考题-10
  • 高中化学第一章原子结构与性质第1节原子结构第1课时能层与能级构造原理课堂达标验收新人教版选修320181012
  • 属兔十二月份出生的命运好吗
  • 网纹草的养殖方法和注意事项_网纹草的品种有哪些
  • 人教版(新课程标准)2019-2020学年六年级上册语文第五组第19课《一面》同步练*B卷
  • 2020学年第一学期幼儿园安全工作总结与2020学年第一学期幼儿园教科研工作计划合集
  • 员工礼仪三_常用礼仪及礼貌用语
  • 上海量得数码科技有限公司企业信息报告-天眼查
  • 2014年中国铜矿采选行业云南省大理白族自治州TOP10企业排名
  • 论如何建立有效的初中科学作业评价体系论文
  • 2008北京奥运会吉祥物福娃造型
  • 【幼儿教育】最新创意教案·幼儿园小班美术粘贴画:给妈妈做面条
  • 火锅混汤怎么处理
  • 2014-2020年中国金属硅行业监测与发展趋势研究报告
  • 关于编制戊醇项目可行性研究报告编制说明
  • Java8 - 实用Optional对象
  • 初中语文《三峡》优质课教案
  • 日光节能温室下沉深度对其采光性能的影响
  • 银行出纳员年度工作总结精选
  • 丹江口水库支流库区的淤积特点与问题
  • 小学作文现实与理想的差距
  • 承德县国农种植专业合作社企业信用报告-天眼查
  • 【工作总结】三八妇女节演讲稿
  • 估值方法和模型的深度讨论
  • 高三人教版数学(理)一轮复*课件:第10章 第7节 离散型随机变量及其分布列
  • 班级管理如何贯彻《守则》和《规范》--康禾中学曾苑强201106
  • 生物工程包括哪些
  • 二0一二年安全培训计划
  • 86例孕早期自然流产患者绒毛染色体分析
  • 零负担护肤很流行 型男保养新标准
  • 企业集团公司打字员XX年述职报告
  • 【2018新课标 高考必考知识点 教学计划 教学安排 教案设计】高三生物:一轮复*——植物激素调节
  • 天津市河西区2019届高三下学期一模考试数学(文)试题+Word版
  • 自然风天空背景PPT模板
  • C语言程序课程设计心得体会范文(精选3篇)
  • XX清明节问候祝福短信
  • 蓖麻种子cDNA_AFLP反应体系的优化
  • 青岛恒盛天信国际贸易有限公司(企业信用报告)- 天眼查
  • 深圳市小壳科技有限公司(企业信用报告)- 天眼查
  • 深圳伊卡美钻珠宝有限公司(企业信用报告)- 天眼查
  • 第二章+旅游者的消费行为与心理
  • 电脑版