java 多重注解_Java注解-元数据、注解分类、内置注解和自定义注解

大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解。

f43a878f5322ad750a274ee62eb9a6a2.png

Java注解有以下几个知识点:元数据

注解的分类

内置注解

自定义注解

注解处理器

Servlet3.0

本文先介绍前面4个知识点:元数据、注解的分类、内置注解、自定义注解。

一、注解简介

注解是Java 1.5引入的,目前已被广泛应用于各种Java框架,如Hibernate,Jersey,

Spring。注解相当于是一种嵌入在程序中的元数据,可以使用注解解析工具或编译器对

其进行解析,也可以指定注解在编译期或运行期有效。

在注解诞生之前,程序的元数据存在的形式仅限于java注释或javadoc,但注解可以提

供更多功能,它不仅包含元数据,还能作用于运行期,注解解析器能够使用注解决定处

理流程。

Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和任何元数据

(metadata)的途径和方法。Annotation是一个接口,程序可以通过反射来获取指定

程序元素的Annotation对象,然后通过Annotation对象来获取注解里面的元数据。

注解API非常强大,被广泛应用于各种Java框架,如Spring,Hibernate,JUnit。

二、 元数据metadata

元数据从metadata一词译来,就是“关于数据的数据”的意思,即描述数据的结构信息。元数据的功能作用有很多,比如:你可能用过Javadoc的注释自动生成文档。这就是元数据功能的一种。总的来说,元数据可以用来创建文档,跟踪代码的依赖性,执行编译时格式检查,代替已有的配置文件。

在Java中元数据以标签的形式存在于Java代码中,元数据标签的存在并不影响程序代码的编译和执行,被用来生成其它的文件或只在运行时知道被运行代码的描述信息。

其作用如下:

①生成文档:这是最常见的,也是java 最早提供的注解。常用的有@param @return 等;

② 跟踪代码依赖性,实现替代配置文件功能。常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量。;

③在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。

三、 注解的分类

根据注解参数的个数:

1)、标记注解:一个没有成员定义的Annotation类型被称为标记注解。

2)、单值注解:只有一个值

3)、完整注解:拥有多个值

根据注解使用方法和用途:

1)、JDK内置系统注解

2)、元注解

3)、自定义注解

四、 内置注解

JavaSE中内置三个标准注解,定义在java.lang中:

@Override

限定重写父类方法,若想要重写父类的一个方法时,需要使用该注解告知编译器我们正在重写一个方法。如此一来,当父类的方法被删除或修改了,编译器会提示错误信息;或者该方法不是重写也会提示错误。

public interface Car {

void run();

}

class QQ implements Car{

@Override

public void run() {}

}

class Bmw implements Car{

@Override

void run() {}

}复制代码

QQ 类编译不会有任何问题,Bmw类在编译的时候会提示相应的错误。父类中省略了public abstract修饰符。@Override注解只能用于方法,不能用于其他程序元素。

@Deprecated

标记已过时,当我们想要让编译器知道一个方法已经被弃用(deprecate)时,应该使用这个注解。Java推荐在javadoc中提供信息,告知用户为什么这个方法被弃用了,以及替代方法是什么;

/**

* Deprecated -->该方法过时(有更好的解决方案)

* @author Administrator

*/

public class TestDeprecated {

@Deprecated

public int test(){

System.out.println("TestDeprecated.test()");

return 0;

}

public void test(int a){

System.out.println("TestDeprecated.test(int)");

}

}复制代码

3. @SuppressWarnings

抑制编译器警告,该注解仅仅告知编译器,忽略它们产生了特殊警告。如:在java泛型中使用原始类型。其保持性策略(retention policy)是SOURCE,在编译器中将被丢弃。

/**

* SuppressWarnings 压制警告

* @author Administrator

*/

public class TestSuppressWarnings {

public static void main(String[] args) {

@SuppressWarnings("unused")

List list =new ArrayList();

}

@SuppressWarnings("rawtypes") //没有定义范型

public static List test(){

return new ArrayList();

}

}复制代码

五、 自定义注解

1、简单入门

@interface:用来声明一个注解。注解类里的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型。可以通过default来声明参数的默认值。

@interface Simple{

//这里定义了一个空的注解,它能干什么呢?我也不知道,但他能用。后面有补充

}复制代码

2、元注解

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

这些类型和它们所支持的类在java.lang.annotation包中可以找到。

@Target

用于描述注解的使用范围(即:被描述的注解可以用在什么地方)。表示支持注解的程序元素的种类,一些可能的值有TYPE, METHOD, CONSTRUCTOR, FIELD等等。如果Target元注解不存在,那么该注解就可以使用在任何程序元素之上。

取值(ElementType)有:

1.CONSTRUCTOR:用于描述构造器

2.FIELD:用于描述域

3.LOCAL_VARIABLE:用于描述局部变量

4.METHOD:用于描述方法

5.PACKAGE:用于描述包

6.PARAMETER:用于描述参数

7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

此时在空注解中加入@Target元注解如:

//此注解只能用在方法上

@Target(ElementType.METHOD)

@interface TestMethod {}复制代码

@Retention

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

取值(RetentionPoicy)有:

1.SOURCE:在源文件中有效(即源文件保留)

2.CLASS:在class文件中有效(即class保留)

3.RUNTIME:在运行时有效(即运行时保留)

此时在上述注解中加入@Retention元注解如:

// 此注解可以用于注解类、接口(包括注解类型) 或enum声明

@Target(ElementType.TYPE)

//该注解运行时有效。注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理

@Retention(RetentionPolicy.RUNTIME)

@interface TestRn{

}复制代码

@Documented

表示使用该注解的元素应被javadoc或类似工具文档化,它应用于类型声明,类型声明的注解会影响客户端对注解元素的使用。如果一个类型声明添加了Documented注解,那么它的注解会成为被注解元素的公共API的一部分,@Documented是一个标记注解。

//可以被例如javadoc此类的工具文档化

@Documented

@interface TestDoc{

}复制代码

@Inherited

表示一个注解类型会被自动继承,如果用户在类声明的时候查询注解类型,同时类声明中也没有这个类型的注解,那么注解类型会自动查询该类的父类,这个过程将会不停地重复,直到该类型的注解被找到为止,或是到达类结构的顶层(Object)。

//被子类继承的注解

@Inherited

@interface TestInheri{}复制代码

3、深入自定义注解

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。

⑴定义注解格式:

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

public @interface 注解名{定义体s}

⑵注解参数(即方法)

注解里面的每一个方法实际上就是声明了一个配置参数,其规则如下:

①修饰符

只能用public或默认(default)这两个访问权修饰 ,默认为default

②类型

注解参数只支持以下数据类型:

基本数据类型(int,float,boolean,byte,double,char,long,short);

String类型;

Class类型;

enum类型;

Annotation类型;

以上所有类型的数组

③命名

对取名没有要求,如果只有一个参数成员,最好把参数名称设为"value",后加小括号。

④参数

注解中的方法不能存在参数

⑤默认值

可以包含默认值,使用default来声明默认值。

⑶实例如下

/*

* 码农定义注解

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@interface Programmer{

String value() default "马云";

}

/**

* 码农类型注解

* @author peida

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@interface ProgrammerType {

/**

* 类型枚举 程序猿 射鸡师

*/

public enum CoderType{MONKEYS,LION,CHOOK};

/**

* 颜色属性

*/

CoderType type() default CoderType.MONKEYS;

}

/**

* 码农制造厂

* @author Administrator

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@interface ProgrammerProductor {

/**

* 厂家编号

* @return

*/

public int id() default -1;

/**

* 厂家名称

* @return

*/

public String name() default "shsxt";

/**

* 厂家地址

* @return

*/

public String address() default "上海";

}

/**

* 注解使用

*/

class Coder{

@Programmer("老裴")

private String coderName;

@ProgrammerType(type=CoderType.MONKEYS)

private String coderType;

@ProgrammerProductor(id=1,name="程序猿乐园",address="荣乐东路")

private String coderProductor;

public String getCoderName() {

return coderName;

}

public void setCoderName(String coderName) {

this.coderName = coderName;

}

public String getCoderType() {

return coderType;

}

public void setCoderType(String coderType) {

this.coderType = coderType;

}

public String getCoderProductor() {

return coderProductor;

}

public void setCoderProductor(String coderProductor) {

this.coderProductor = coderProductor;

}

}

乐字节原创,转载请注明出处复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

酷狗音乐linux版_酷狗音乐概念版APP内测获用户好评:极简化,更高级

这两天在网上冲浪的时候,发现不少网友都在安利一个叫做“酷狗音乐概念版”的APP,难道是酷狗又在闷声搞大事了?搜了一下发现,原来是酷狗音乐概念版APP已经开始进入内测阶段,尝试着下载使用,果然发现“更酷更…

java 计算器类图_多态计算器(封装、继承、多态、简单工厂)

一.封装向对象程序设计中,一个非常重要的技术便是封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。这样做的好处在于可以使类内部的具体实现透明化&#xff…

图书管理系统 java 源码_[源码和文档分享]基于C语言和SQL SERVER数据库实现的图书管理系统...

摘 要本文根据《数据库应用系统设计》课程要求而做。选择图书馆管理系统设计与开发是因为觉得图书馆管理系统对我们的帮助很大,并且经常去图书馆,对图书馆的大部分功能及流程还是比较了解,而且现在有些地方可能还不够完善。这次课程设计目标是…

sql server 修改字段不能为空_SQL-SQL介绍

一SQL 介绍SQL(Structured Query Language),语义是结构化语言, 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统;二 数据库介绍2.1 数据库我们已经知道了SQL是操作数据库的语言,那么数据库是什么&a…

拼接的option会多出空行_Word空格,空行,页眉横线等问题,我只花一分钟就全解决了...

从网上复制下来的资料粘贴到Word文档上,出现了许多空格、空行、页眉横线等问题,这时候我们该如何快速地解决这些问题,看看下面的操作你就知道了。一、删除空格1、空格案例从网上复制下来的文字到Word文档中,出现字与字之间有好多空…

oracle连接工具_扯一扯Tableau软件配置数据源系列之Oracle

作者:扯蛋君编辑:齐天大圣声明:本文章仅用于Taleau软件的应用、学习沟通,不代表Taleau公司;文中所示截图来源Taleau官方及软件公开内容,相应著作权归Tableau所有。 今天给大家介绍Tableau工具如何连接数据库…

如何和后台接触的_后台产品,不只是做支持

最近在招聘后台产品经理,面试过程中提到一个问题,这个问题之前也困扰了我很久:你做的后台产品,价值体现在哪里?只是做业务支持么?今天就来聊聊这个话题。我是做后台产品出身,最开始入行做的是云…

云计算呼叫中心_干货|云呼叫中心系统和传统呼叫中心系统的区别在哪?

随着社会的发展,呼叫中心由传统的呼叫中心逐渐发展为云呼叫中心。然而关于这两者的区别,您知道吗?跟随畅远技术一同来了解一下吧......一、购买、安装不同传统呼叫中心软件在配置方面有几个特点:一次购买终身使用;安装…

隔一段时间查找一次 golang_剑指 offer-04 二维数组中的查找

算法名称:二维数组中的查找题目内容:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该…

在线电脑配置PHP源码,域名授权系统PHP源码 V2.7.0 支持盗版追踪

最新漂亮简洁大气的域名授权系统PHP源码,域名授权系统PHP版,功能强大带有后台,经过版本升级,全新美观大气的UI洁面!支持盗版追踪,与卡密系统对接购买卡密对域名进行授权,支持授权代码、到期时间…

php 504网关,504 gateway timeout什么意思

504 gateway time-out(504网关超时错误)是HTTP状态代码,这意味着一个服务器在尝试加载网页或填写浏览器的另一个请求时未从其访问的另一台服务器收到及时响应。换句话说,504错误通常表明不同的计算机,即您正在获取504消息的网站无法控制但依赖…

python 二维数组长度_剑指offer二维数组中的查找【Java+Python】

点击上方"蓝字",关注了解更多二维数组中的查找1. 题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组…

失物招领小程序_通知 | 保卫部拟设置失物招领处

保卫部拟设置失物招领处为规范对遗失物品的接收、登记、发放等工作,切实维护师生利益,保卫部拟设置失物招领处,现将有关失物招领的流程明确如下:1、失物招领地点:保卫部二楼中厅。2、遗失物的接收。师生将拾得的遗失物…

php获取表所有数据类型,php excel 导入 导入三级分类 表格应该怎么设计才能得到想要的数据格式?...

就是多个1级分类 下面有不确定个二级分类 二级分类下面有不确定个三级分类 我想获取到相关的数据组合写入数据库 但是这个格式不知道怎么排才能获取到对的数据有空的亲们给看看 帮下 谢谢有没有办法获取整列的值 然后根据长度去区分2列 然后再区分三列现在获取到的数据格式是按…

redis 清空db下_PHP操作redis实现的分页列表

正文内容封装类文件如下:/* * redis 分页数据类库 */class redisPage{protected $_redis;protected $_redis_ip 127.0.0.1; //ipprotected $_redis_port 6379; //端口protected $_redis_db 0; //数据库号protected $_hash_prefix my_data; //前缀名称public fun…

php5.1.4,apache 2.2.2 + PHP5.1.4 不能运行的解_php

apache 2.2.2 php5.1.4 不能运行的解决办法.问题,使用传统的模块化方法安装PHP5.1.* apache 2.2.2 后不能启动,提示:"Cannot load C:/php/php5apache2.dll into server: The specified module could not be found."原因:PHP压缩包里的php5apache2.dll只适用于apach…

java 保留字符串,如何在Java中保留字符串而不使用反转功能

有以下几种在Java中反转字符串的方法:使用for循环使用While循环使用静态方法使用For循环使用for循环在Java中反转字符串的示例在下面的示例中, 我们使用了for循环来反转字符串。 for循环执行直到条件i> 0变为false为止。import java.util.Scanner;class ReverseS…

php用cdn打不开,开启 CDN 后 wordpress 后台打不开的解决办法

现在很多站长把网站放到国外,使用 CDN 加速功能提高国内的访问速度,前面提到过开启腾讯云 CDN 后 wordpress 后台显示:连接被重置的解决办法,而今天遇到的是另外一种情况,有时候会遇到开启 CDN 后 wordpress 后台打不开…

android 支付宝月账单 统计图_记账其实很简单,用微信、支付宝就够了!

用微信、支付宝记账,从起告别糊涂账养成记账的好习惯,能让你对生活中的各种收支做到心中有数,从此告别糊涂账。长期坚持,能帮助我们理性消费、科学理财。但或许是因为记账的过程太枯燥,或许是因为没找到合适的记账方法…

mysql抖动可能的原因,12 | 为什么我的MySQL会“抖”一下?

你的 SQL 语句为什么变“慢”了平时执行很快的更新操作,其实就是在写内存和日志,而 MySQL 偶尔“抖”一下的那个瞬间,可能就是在刷脏页(flush)。当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写…