Annotation介绍

概念

注解Annotation是java 1.5的新特性,是一种能够添加到 Java 源代码的语法元数据。类、方法、变量、参数、包都可以被注解,可用来将信息元数据与程序元素进行关联。

作用

a. 标记,用于告诉编译器一些信息

b. 编译时动态处理,如动态生成代码

c. 运行时动态处理,如得到注解信息

Java注解可以用在构建期。当构建我们的工程时,构建进程会编译源码、生成xml文件,打包编译后的代码和文件到jar包。构建过程一般由构建工具自动完成,常用的构建工具有ant、maven。构建工具在构建时会自动扫描我们的代码,当遇到构建期注解时,会根据注解的内容生成源码或者其它文件。

注解的格式

a)一个java注解由一个@符后面跟一个字符串构成,例如:@name

b)java注解中一般包含一些元素,这些元素类似于属性或者参数,可以用来设置值,例如@Enity(name="jiang",age="20")

使用细节

注解可以用于描述一个类、接口、方法、方法参数、字段、局部变量等。

1.如果注解没有参数则不用写参数体

2.如果只有一个参数比如named value,则参数名可以省略

3.也可以同时使用多个注解来标示

4.可以重复使用注解,不过只有在java SE 8 才支持

Java 常用注解

内置注解

  • @Override 表示当前方法覆盖了父类的方法,主要用在一个子类的方法中。

  • @Deprecated 表示方法已经过时,java不赞成使用这些被描述的对象方法上有横线,使用时会有警告

  • @SuppviseWarnings 表示关闭一些警告信息(通知java编译器忽略特定的编译警告,例如进行了一个不安转的类型转换)。

元注解:用来描述注解的注解

  • @Documented:告诉JavaDoc工具,当前注解本身也要显示在Java Doc中。

  • @Retention:用来定义当前注解的作用范围,有以下范围:

    • RetentionPolicy.SOURCE : 注解只存在于源码中,不会存在于.class文件中,在编译时会被忽略掉
    • RetentionPolicy.CLASS:注解只存在于.class文件中,在编译期有效,但是在运行期会被忽略掉,这也是默认范围
    • RetentionPolicy.RUNTIME:在运行期有效,JVM在运行期通过反射获得注解信息。
  • @Target:用于指定注解作用于java的哪些元素,未标注则表示可修饰所有。

  • @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.以上所有类型的数组

注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此, 使用空字符串或0作为默认值是一种常用的做法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,因为每个注解的声明中,所有元素都存在,并且都具有相应的值,为了绕开这个约束,我们只能定义一些特殊的值,例如空字符串或者负数,一次表示某个元素不存在,在定义注解时,这已经成为一个习惯用法。

上手实验

a.java
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** * 水果名称注解**/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface front{ //自定义注解 @frontString value() default "";
}b.java
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*** * 水果颜色注解**/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documentedpublic @interface behind{//自定义注解@behindpublic enum Color{bule,red,green}Color Behind() default Color.red;
}

c.java 部分
    @front("Apple")private String appleName;@behind(Behind=Color.green)private  String appleColor;public void setAppleColor(String appleColor) {this.appleColor = appleColor;}

在之前没有具体了解清楚annotation的功能,以为在注解之后相应的变量会被赋值,所以在进行调试的时候看到变量的值一直都是null,为此感到很困惑,以为是自己的哪些方法不对。后来通过仔细查阅发现annotation仅仅是类似于标签以及接口,对代码的运行没有起到什么效果。

总结

  1. 如果注解难于理解,你就把它类同于标签,标签为了解释事物,注解为了解释代码。
  2. 注解的基本语法,创建如同接口,但是多了个 @ 符号。
  3. 注解的元注解。
  4. 注解的属性。
  5. 注解主要给编译器及工具类型的软件用的。
  6. 注解的提取需要借助于 Java 的反射技术,反射比较慢,所以注解使用时也需要谨慎计较时间成本。

the examples in Hello1.java

hello1 :一个基于JavaServer Faces技术的应用程序,它使用两个XHTML页面和一个托管bean

首先需要了解 构造型:一种指定一下内容的注释:

  • 默认范围

  • 零个或多个拦截器绑定

  • (可选)@Named注释,保证默认EL命名

  • (可选)@Alternative注释,指定具有此构造型的所有bean都是备选方案

CDI提供了一个名为的内置构造型Model,它用于定义模型 - 视图 - 控制器应用程序架构的模型层的bean。这个构造型指定bean是@Named@RequestScoped

@Named
@RequestScoped
@Stereotype
@Target({TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface Model {}
import javax.enterprise.context.RequestScoped;
/*** 虽然RequestScoped必须与规范要求的内置请求上下文相关联,但允许第三方扩展将其与自己的上下文相关联。* 指定bean是请求范围的* 1.请求范围处于活动状态  * 2.请求上下文被销毁*/
import javax.inject.Named;
/*** 基于字符串的限定符* Example usage:public class Car {@Inject @Named("driver") Seat driverSeat;@Inject @Named("passenger") Seat passengerSeat;...}*如果使用bean类的默认名称,则可以指定@Model 为注释,而不必同时指定@Named和@RequestScoped.*该@Model注释被称为刻板印象,对于封装等注解注释的术语。*/
//
@Named
@RequestScoped
public class Hello {}

部分借鉴于:https://blog.csdn.net/u013703461/article/details/66259013

https://blog.csdn.net/briblue/article/details/73824058

非常感谢~

转载于:https://www.cnblogs.com/sece/p/10565637.html

Introduction of Annotation相关推荐

  1. Javaweb第三周作业

    Introduction of Annotation,explain the examples in Hello1.java: Annotation--Java注解 Java 注解用于为 Java 代 ...

  2. Spring 4 Security MVC登录注销示例

    Today we will learn about Spring Security Login Example. Before reading this post, please go through ...

  3. jpa mysql boolean_jpa中boolean型属性映射的问题

    JPA_Annotation_Support_Boolean_type #JPA Annotation注解本身不支持boolean类型,修改部分代码使得此项功能完整 Introduction JPA ...

  4. ANNOTATION PROCESSING 101 by Hannes Dorfmann — 10 Jan 2015

    原文地址:http://hannesdorfmann.com/annotation-processing/annotationprocessing101 In this blog entry I wo ...

  5. Multimedia Event Extraction (M2E2) Annotation Guideline V0.1

    文献笔记 多媒体事件抽取注释指南 下载地址http://blender.cs.illinois.edu/software/m2e2/ 文本注释参考ACE的注释方法,本文重点介绍图像注释的方法 1 In ...

  6. Distantly Supervised NER with Partial Annotation Learning and Reinforcement Learning阅读笔记

    论文地址:Distantly Supervised NER with Partial Annotation Learning and Reinforcement Learning (aclanthol ...

  7. Generalizing from a Few Examples: A Survey on Few-Shot Learning 小样本学习最新综述| Introduction and Overview

    参考链接:小样本学习与智能前沿·公众号 Author list YAQING WANG, Hong Kong University of Science and Technology and Baid ...

  8. Spring Introduction(@DeclareParents)

    Spring中,Introduction的实现是通过将需要添加的新的行为逻辑,以新的接口定义增加到目标对象上.在Spring中,spring是通过Before.After.AfterRunning.A ...

  9. Introduction(英语笔记)

    Introduction In recent years, recommender systems, which help users discover items of interest from ...

最新文章

  1. 中国学者变革300多年来的活塞!MIT、哈佛联手,动力3倍以上,可节能40%
  2. Android获取和判断当前手机状态和信息
  3. 前端面试题:算法-冒泡排序
  4. js数组中foEach和map的用法详解 jq中的$.each和$.map
  5. Delphi中TWebBrowser中注入Js
  6. 【转】关于CLR内存管理一些深层次的讨论[下篇]
  7. String、StringBuilder和StringBuffer的区别和用法
  8. ORA-39181: Only partial table data may be exported due to fine grain access control on OE.PURCHAS
  9. c语言 判断乘法是否溢出,如何判断C语言算术运算的越界问题
  10. MySQL 一张表中两个字段值互换
  11. js阻止鼠标右击_使用JS 禁止键盘快捷方式和禁止鼠标右键操作弹窗提示
  12. vue axios的路由拦截器
  13. 4. Python--Scipy库(上/1-6)
  14. java环境已经弄好jar文件还是打不开解决方法
  15. 数字图像处理课程作业1-大米检测
  16. MT7688: Shine定点MP3压缩库试验
  17. iOS9获取手机序列号serialNumber(UDID)
  18. 如何取消您的Nintendo Switch在线订阅
  19. 加入购物车里面的商品被商家调整价格以后如何处理金额问题
  20. 系统分析师-2021年下午简答题

热门文章

  1. 微软ERP的制造业解决方案(转)
  2. Android 调用系统分享图片、视频等文件
  3. 计算机控制数控机床是什么领域,数控机床是计算机数字控制机床.ppt
  4. 抖音小店无货源处罚全解,一文带你读懂官方规则,合理规避风险
  5. html在线音频播放器实训总结,HTML5 播放器心得与小结
  6. adcclk最大_ADC12采样保持时间与采样频率
  7. 同一局域网手机不能通过IP访问电脑本地项目?解决办法如下
  8. 多种系统exe打开方式还原的详细方法
  9. linux 安装jeakens_Linux安装mysql过程(转+完善)
  10. 听说,这 9 张脸是人脸识别的“万能钥匙”?