Java高级特性———Java注解
什么是注解(Annotation)?
注解是放在Java源码的类、方法、字段、参数上的一种标签,在Java SE 5.0版本中开始引入。注解同class和interface一样,也属于一种类型。
如何定义注解?
通过关键字@interface去定义,基本的使用方法如下:
@interface +注解名{} //注解定义规则
//例:创建一个名称为testAnnotation的注解
public @interface testAnnotation{
}
通过定义注解,可观察到注解相比于接口类的定义,前面多了一个“@”符号。
以上的代码可以理解为:创建了一个名称为testAnnotation的注解。
如何应用注解?
上边创建完注解以后,如何去使用注解?根据注解的定义,我们可以了解到注解可以放置到类、方法、字段或者是参数上。下面是一个注解的使用案例:
//在方法test上使用testAnnotation注解
@testAnnotation
public static void test() { } //定义名称为testAnnotation的注解
@interface testAnnotation{ }
要想注解能够正常的工作,我们还需要明白Java中的元注解。在讲元注解前,我们需要理解注解中如何定义注解的属性。
何为注解的属性?
注解的属性也叫做成员变量。注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。
如何定义注解属性?
属性的定义: 类型+属性名() +[default +"默认值"];(其中[ ]括号内的为可要可不要部分)
下面是定义注解的属性的案例:
//定义名称为testAnnotation的注解
@interface testAnnotation{
/**
* 注解的属性:
*1.定义属性:类型+属性名();
*2.为属性指定默认值:通过default关键字。(例如:int id() default 0)
**/ //定义属性名为id的属性,其默认值为0
int id() default 0; }
Tip:在注解中定义属性时它的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组。 思考如何使用带有属性的注解,且如何给属性赋值? 通常我们在使用注解的时候,在后边跟上一个英文括号,在括号里边给每个注解的属性赋值,然后使用逗号分隔各个属性值。赋值的方式我们通过:属性名=值。
例如:
//使用注解,并为id属性赋值
@testAnnotation(id=0)
public static void test() { } //定义名称为testAnnotation的注解
@interface testAnnotation{
/**
* 注解的属性:
*1.定义属性:类型+属性名();
*2.为属性指定默认值:通过default关键字。(例如:int id() default 0)
**/ //定义属性名为id的属性,其默认值为0
int id() default 0; }
另外,还有一种情况。如果一个注解内仅仅只有一个名字为 value 的属性时,应用这个注解时可以直接接属性值填写到括号内。
例如:
//使用注解,并为value属性赋值
@testAnnotation("hgqin")
public static void test() { } //定义名称为testAnnotation的注解
@interface testAnnotation{
/**
* 注解的属性:
*1.定义属性:类型+属性名();
*2.为属性指定默认值:通过default关键字。(例如:int id() default 0)
**/ //定义属性名为id的属性,其默认值为0
int id() default 0;
String value(); }
何为元注解?
元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。
如果难于理解的话,你可以这样理解。元注解也是一张标签,但是它是一张特殊的标签,它的作用和目的就是给其他普通的标签进行解释说明的。
元注解有 @Target、@Retention、@Documented、@Inherited、@Repeatable 5 种。(需要重点记忆)
逐个分析元注解:
@Target:Target 是目标的意思,@Target 指定了注解运用的范围。你可以简单的理解为@Target标签指定了自定义注解使用的场景(比如类上或者方法上等)。
@Target的取值有:
- ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
- ElementType.CONSTRUCTOR 可以给构造方法进行注解
- ElementType.FIELD 可以给属性进行注解
- ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
- ElementType.METHOD 可以给方法进行注解
- ElementType.PACKAGE 可以给一个包进行注解
- ElementType.PARAMETER 可以给一个方法内的参数进行注解
- ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
@Retention:Retention 的英文意为保留期的意思。当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间。
它的取值如下:
- RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
- RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
- RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
@Document:Document 的英文意为文档的意思。顾名思义,这个元注解肯定是和文档有关。它的作用是能够将注解中的元素包含到 Javadoc 中去。
@Inherit :Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。
@Repeatable:Repeatable 自然是可重复的意思。@Repeatable 是 Java 1.8 才加进来的,所以算是一个新的特性。
如何完整的定义一个注解?
例如:
//使用注解,并为id属性赋值
@testAnnotation("hgqin")
public static void test() { } @Target(ElementType.METHOD) //定义使用范围为方法上
@Retention(RetentionPolicy.RUNTIME) //定义存活时间为运行时
@Documented //可文档
@Inherited //继承
//定义名称为testAnnotation的注解
@interface testAnnotation{
/**
* 注解的属性:
*1.定义属性:类型+属性名();
*2.为属性指定默认值:通过default关键字。(例如:int id() default 0)
**/ //定义属性名为id的属性,其默认值为0
int id() default 0;
String value(); }
常见的内置注解有哪些?
1.@Override:定义在java.lang.Override包中,此注解只用于修饰方法,表示一个方法声明打算重写超类中的另一个方法声明。
2.@Deprecated:定义在java.lang.Deprecated包中,此注解可以用来修饰构造器、字段、类、方法、包、属性等。
- 注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它是危险的,或者因为存在更好的替代方法。 编译器在不被弃用的代码中使用或覆盖不推荐使用的程序元素时发出警告。
3.@SupressWarnings:定义在java.lang.SupressWarnings包中, 此注解可以用来修饰类、构造器、方法、字段等。用来抑制编译时的警告信息。
>与前两个不同,需要传入一个参数才能使用,这些参数都是提前定义好的,使用方法有下面几种方式:
(1)@SupressWarnings(“all”)
(2)@SupressWarnings("unchecked")
(3)@SupressWarnings(value="{"unchecked","deprecation"}")
(4)等等...
Java高级特性———Java注解的更多相关文章
- paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型
paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...
- Java高级特性-String、StringBuffer和StringBuilder
Java高级特性-String.StringBuffer和StringBuilder String Java语言中的字符串值都属于String类,虽然有其他方法表示字符串(如字符串数组),但Java一 ...
- java高级特性增强
第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...
- Java高级特性——反射机制(第二篇)
在Java高级特性——反射机制(第一篇)中,写了很多反射的实例,可能对于Class的了解还是有点迷糊,那么我们试着从内存角度去分析一下. Java内存 从上图可以看出,Java将内存分为堆.栈.方法区 ...
- Java高级特性1_流库_初体验
Java高级特性流库_初体验 面对结果编程 在编程里, 有两种编程方式, 一种是面对过程编程, 一种是面对结果编程. 两者区别如下 面向过程编程 面向过程编程需要编程程序让程序依次执行得到自己想要的结 ...
- JAVA高级特性 - 注解
注解是插入到代码中用于某种工具处理的标签.这些标签可以在源码层次上进行操作,或者可以处理编译器将其纳入到注解类文件中. 注解不会改变对程序的编译方式.Java编译器会对包含注解和不包含注解的代码生成相 ...
- 云端卫士实战录 | Java高级特性之多线程
<实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...
- Java高级特性之泛型
首先我们先提出两个问题: 什么是泛型? 为什么要使用泛型?我们先来看看第一个问题什么是泛型.如果你对Java三大特性中的多态性理解的比较透彻的话,泛型就比较好理解了.多态性表示一个对象具备多种状态.比 ...
- Java高级特性 第2节 java中常用的实用类(1)
一.Java API Java API即Java应用程序编程接口,他是运行库的集合,预先定义了一些接口和类,程序员可以直接调用:此外也特指API的说明文档,也称帮助文档. Java中常用的包: jav ...
随机推荐
- Kafka和SpringBoot
事先必备: kafka已安装完成 1.目录结构 2.父pom <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns ...
- PHP arsort() 函数
------------恢复内容开始------------ 实例 对关联数组按照键值进行降序排序: <?php$age=array("Peter"=>"35 ...
- 5.4 省选模拟赛 修改 线段树优化dp 线段树上二分
LINK:修改 题面就不放了 大致说一下做法.不愧是dls出的题 以前没见过这种类型的 不过还是自己dp的时候写丑了. 从这道题中得到一个结论 dp方程要写的优美一点 不过写的过丑 优化都优化不了. ...
- luogu P4726 【模板】多项式指数函数 多项式 exp 牛顿迭代 泰勒展开
LINK:多项式 exp 做多项式的题 简直在嗑药. 前置只是 泰勒展开 这个东西用于 对于一个函数f(x) 我们不好得到 其在x处的取值. 所以另外设一个函数g(x) 来在x点处无限逼近f(x). ...
- luogu P3920 [WC2014]紫荆花之恋
LINK:紫荆花之恋 每次动态加入一个节点 统计 有多少个节点和当前节点的距离小于他们的权值和. 显然我们不能n^2暴力. 考虑一个简化版的问题 树已经给出 每次求某个节点和其他节点的贡献. 不难想到 ...
- (数据科学学习手札91)在Python中妥善使用进度条
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在日常运行程序的过程中常常涉及到循环迭代过程,对 ...
- Linux的VMWare中Centos7磁盘分区管理 fdisk分区和制作文件系统格式化和开机自动挂载
一.硬盘的组成零件扇区 磁道 磁盘容量 磁盘分区 简介 硬盘由容量.柱面数.磁头数.扇区数 C/H/S, Cylinder, Head, Sector(柱面/磁头数/扇区数) 1.磁头数表示硬盘总共有 ...
- day6. while双项循环及for循环
一.双向循环经典练习 1.打印十行十列小星星(2个循环) # j 外循环用来控制行数 j = 0 while j<10: # 打印一行十个星星 i = 0 while i <10: # 写 ...
- OpenCL设计优化(基于Intel FPGA SDK for OpenCL)
1.首先了解Intel FPGA SDK for OpenCL实现OpenCL的设计组件,包括: kernels, global memory interconnect, local memory, ...
- Linux-sed命令使用笔记
Linux的sed命令和python脚本一起,可以对文本进行快速的修改.比如在删除日志的时候,python写出固定日期删除脚本,再用sed循环将python脚本的日期修改调用,就可以批删除指定日期的日 ...