Java开发之路

日期:2019-11-04编辑作者:最快开奖计算机

[Java开拓之路](15)注解

1. 简介

 

注明(也被称得上元数据卡塔尔,为大家在代码中增加消息提供了生龙活虎种情势化的艺术。证明在必然水平上是把元数据与源代码文件结合在同盟,并非保留在外表文书档案中这一大趋势之下所催生的。

 

它能够提供用来整体的描述程序所需的新闻,而这几个音讯是无计可施使用Java来发挥的。因而,注脚使得大家能够以将编写翻译器来测量试验和表达的格式,存款和储蓄有关程序的附加新闻。表明能够用来变化描述符文件,以至是新的类定义。通过使用表明,大家得以将那几个元数据保存在Java源代码中,并利用Annotation API为友好的笺注构造管理工科具。

 

解说能够转换特别深透易读的代码以致编写翻译器类型检查等等。

 

阐明(annotation卡塔 尔(阿拉伯语:قطر‎实在实际的源代码等第保存全体的消息,并非某种注释性文字(comment卡塔 尔(阿拉伯语:قطر‎,那使得代码特别洗练,便于维护。

 

2. 申明分类

 

按照运行机制分类 描述
源码注解 注解只在源码中存在,编译成.class文件就不存在了
编译时注解 注解只在源码和.class文件中都存在(例如:@override)
运行时注解 在运行阶段还起作用,甚至影响运行逻辑的注解(例如:@Autowired)

 

 

3. 内置证明:

 

(1)@override

 

代表前段时间的诀要定义将覆盖超类中的方法。如果您一点都不小心拼写错误,也许措施具名对不上被覆盖的措施,编写翻译器就能够生出错误提示。

 

(2)@Deprecated

 

要是工程师使用了讲解为它的因素,那么编写翻译器会生出警示音信。

 

(3)@SuppressWarnings

 

关闭不当的编写翻译器警报音讯(在java SE5 从前,也得以行使那么些注明,可是被忽视不起成效卡塔 尔(英语:State of Qatar)

 

4. 为主语法

 

4.1 定义注脚

 

可以看看评释的概念很像接口的概念。事实上,与别的任何Java接口同样,评释也会被编写翻译成class文件。

package com.qunar.annotation;

 

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

 

public class Annotation {

// 定义Description注解

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Inherited

@Documented

// 使用@interface 关键字定义注解

public @interface Description{

// 成员以无参无异常方式声明

String desc();

String author();

// 可以使用default关键字为成员指定一个默认值

int age() default 18;

}

}

 

除了那几个之外@符号以外,@Description的概念很像八个接口。定义申明的时候会须要有的元申明,如@Target和@Retention。@Target用来定义你的笺注将用以哪个地点(是三个方法上只怕贰个类上卡塔 尔(英语:State of Qatar),@Retention用来定义该注明在哪贰个品级上可用(在源代码上只怕是类公事上或许是运作时卡塔 尔(英语:State of Qatar),具体下边疏解。

 

4.2 评释成分

 

评释@Description中含有int元素age,以至String成分desc和author。证明成分得以选拔的档案的次序如下:

  • 不无中央数据类型(int,float,boolean等卡塔尔
  • String
  • Class
  • enum
  • Annotation
  • 上述项指标数组 假若你使用了别样类型,那么编写翻译器就能报错。注意,也不容许行使此外包装档案的次序,可是是因为活动打包的留存,这算不上什么范围。注明也得以充任成分的门类,也便是申明能够嵌套。

 

4.3 暗中认可值限定

 

编写翻译器对成分的暗许值某个过分的呵斥。

首先,元素不可能有不鲜明的值,也正是说元素必须要么有暗中认可值,要么使用申明时提供要素的值。

说不上,对于非核心项目标成分,无论是在源代码中宣称时,可能是在解说接口中定义默许值时,都不能够以null作为其值。为了这几个节制,大家不能不自身定义一些非常的值,比方空字符串或者负数,来表示某些成分官样文章。

 

4.4 元注解

 

元注解只担负注明其余的讲授。

 

元注解

参数

描述

@Taget

 

CONSTRUCTOR

构造器的扬言

意味着表明能够用来什么地点

 

FIELD

域声明

METHOD

艺术证明

PACKAGE

包声明

PARAMETER

参数证明

TYPE

类,接口或enum声明

LOCAL_VARIABLE

有的变量注明

 

@Retention

SOURCE

解说只在源码中留存,编译成.class文件就不设有了

代表需求在怎么等第保存该证明新闻

CLASS

解说只会在.class文件存在,会被VM放任

RUNTIME

VM就要运转期也保留评释,因而能够透过反射机制读取申明的音讯

@Document

 

 

将此注脚富含在Javadoc中

@Inherited

 

 

同意子类世襲父类中的评释

 

 

4.5 使用评释

 

语法:@<注脚名称>(<成员名1> = <成员值1>,<成员名2> = <成员值2>,...)

 

package com.qunar.annotation;

 

import com.qunar.annotation.Annotation.Description;

 

public class Student {

private String name;

 

@Description(desc = "set name for student object" , author = "sjf0115")

public String getName() {

return name;

}

 

@Description(desc = "get name from student object" , author = "sjf0115", time = "2016-01-11")

public void setName(String name) {

this.name = name;

}

}

 

 

5. 深入分析注明

 

通过反射机制获取类,函数也许成员上的运转时注脚新闻,进而完成动态调控造进程序运营的逻辑。

 

package com.qunar.annotation;

 

import java.lang.reflect.Method;

 

import com.qunar.annotation.Annotation.Description;

 

public class ParseAnnotation {

public static void main(String[] args){

Class class1 = null;

try {

// 使用类加载器加载类

class1 = Class.forName("com.qunar.annotation.Student");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

// 判断Student类上是否有Description注解

boolean isExits = class1.isAnnotationPresent(Description.class);

if(isExits){

// 注解实例

Description desc = class1.getAnnotation(Description.class);

System.out.println("注解:" + desc.toString());

}//if

 

// 获取Student类上的所有方法

Method[] methods = class1.getMethods();

// 遍历所有方法

for (Method method : methods) {

// 判断方法上是否有Description注解

isExits = method.isAnnotationPresent(Description.class);

if(isExits){

Description description = method.getAnnotation(Description.class);

System.out.println("方法注解:" + description.toString());

}//if

}//for

}

}

运营结果:


方法注解:@com.qunar.annotation.Annotation$Description(time=2016-01-12, desc=set name for student object, author=sjf0115)
方法注解:@com.qunar.annotation.Annotation$Description(time=2016-01-11, desc=get name from student object, author=sjf0115)

 

package com.qunar.annotation;

 

import java.lang.annotation.Annotation;

import java.lang.reflect.Method;

 

import com.qunar.annotation.Annotation.Description;

 

public class ParseAnnotation {

public static void main(String[] args){

Class class1 = null;

try {

// 使用类加载器加载类

class1 = Class.forName("com.qunar.annotation.Student");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

// 判断Student类上是否有Description注解

boolean isExits = class1.isAnnotationPresent(Description.class);

if(isExits){

// 注解实例

Description desc = class1.getAnnotation(Description.class);

System.out.println("注解:" + desc.toString());

}//if

 

// 获取Student类上的所有方法

Method[] methods = class1.getMethods();

// 遍历所有方法

for (Method method : methods) {

// 方法上获取所有的注解

Annotation[] annotations = method.getAnnotations();

for (Annotation annotation : annotations) {

if(annotation instanceof Description){

System.out.println("Description注解:" + annotation.toString());

}//if

}//for

}//for

}

}

 

这八个程序都用到了反光的措施:getMethods()和getAnnotation(),它们都归于AnnotatedElement接口(Class,Method与Field等类都完成了该接口卡塔尔。getAnnotation()方法再次回到钦定项目标讲解对象,在那地就是Description。如若被疏解的方法上从不应当项指标笺注,则赶回null值。

1. 简介评释(也被叫作元数据卡塔 尔(英语:State of Qatar),为大家在代码中增多消息提供了生龙活虎种方式化的艺术。注明在必然水准上是把元数...

本文由今晚最快开奖现场直播发布于最快开奖计算机,转载请注明出处:Java开发之路

关键词:

Nginx集群解决均衡负载及生产环境热部署,ID的持

平常的,假若三个顾客展开多个浏览器,服务器就能分配多个sessionid,通过session.getId()函数能够回来session的id; 像这种...

详细>>

实现指纹识别登录,在Ubuntu上安装fprint实现指纹

ThinkPad T420i 上 Ubuntu12.04 完毕指纹识别登入 实验室配的新计算机有指纹识别,才装好Ubuntu没二日,正好折腾了生气勃勃...

详细>>

Emacs24在Ubuntu 12.4 LTS 上编译

Emacs下载的地方最棒是接纳国内的镜像,那样速度会快捷,下载地址为 安卓6.0  lunch full_la68_A40-eng 编译(Ubuntu 12.046...

详细>>

Linux 中head 命令

Linux 中head命令是用来查看具体文件的前头几行的剧情,具体格式如下: head filename: 你能够经过head命令查看具体文件...

详细>>