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 ...
随机推荐
- format 进阶
'''format(数字,str(算术式)+"d或者f") d 表示 int f 表示 float ''' format(5,str(2*4)+"d") '' ...
- 部分浏览器 set-cookie 不成功踩坑记录
事件起因: 公司正在做一个sso的单点登录的项目,做完之后,在测试阶段,不同的终端的兼容测试时候,好几个不同的浏览器出现了不同的问题,有登录之后自动退出,有登陆不成功等问题. 在 pc 端只有 uc ...
- pagehelper的使用和一些坑!
[toc] ##1.1 pagehelper介绍和使用 PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件. 原本以为分页插件,应该是很简单的,然而PageHelper比我想象 ...
- KMP,HASH,Trie,AC自动机
我做个总结算了下午看了一下AC自动机和学习我的大生物(当然是多谢鑫神了)..完了要崩.. 1 KMP 只要是学过的人都觉得比较简单吧 但是学不会的人就感觉很难了,我是那种顿悟的然后感觉非常简单的人过程 ...
- 转)Understanding Java Memory Management
Understanding Java Memory Management - IBM Java Native Interface (JNI) Objects and Code Java Native ...
- 在Spring Boot中动态实现定时任务配置
原文路径:https://zhuanlan.zhihu.com/p/79644891 在日常的项目开发中,往往会涉及到一些需要做到定时执行的代码,例如自动将超过24小时的未付款的单改为取消状态,自动将 ...
- CSS表单与数据表(下)
2.表单 表单是用户输入内容的地方.表单涉及的控件很多,而且一直很难给它们应用样式.无法控制样式的部分,可以通过自定义控件来解决. 2.1 简单的表单 2.1.1 fieldset与legend fi ...
- JavaScript calss语法糖
JavaScript calss语法糖 基础知识 严格意义上来讲,在Js中是没有类这一概念的. 我们可以运用前面章节提到的构造函数来模拟出类这一概念,并且可以通过原型对象的继承来完美的实现实例对象方法 ...
- java方法与方法的重载
一 方法 1.方法的概述 在java中,方法就是用来完成解决某件事情或实现某个功能的办法. 方法实现的过程中,会包含很多条语句用于完成某些有意义的功能——通常是处理文本, 控制输入或计算数值.我们可以 ...
- JavaScript 防抖(debounce)和节流(throttle)
防抖函数 触发高频事件后,n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间 /** * * @param {*} fn :callback function * @param {* ...