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,一经查实,立即删除!

相关文章

python getattr函数_Python中的getattr()函数详解

在计算机编程中,自省是指这种能力:检查某些事物以确定它是什么、它知道什么以及它能做什么。自省向程序员提供了极大的灵活性和控制力。自省(introspection),在计算机编程领域里,是指在运行时来判断一个对象的类型的能力。它是Pyt…

ie8不兼容java项目_常见IE8兼容性问题及解决

1、css3媒体查询IE8不支持媒体查询解决:respond.js,在页面中所有css文件的引用位置之后引用Respond.js2、HTML5新标签IE8不支持H5新标签解决:html5shiv.js,在页面中引用html5shiv.js文件。必须添加在页面的元素内,因为…

python对图像二值化_python如何二值化图像

在python中二值化图像的方法:首先将图片转化为灰色图像;然后自定义灰度界限;最后输入“photoImg.point(table,1)”命令(table为自己创建的数组名)即可二值化图像。# 图片二值化代码如下:from PIL import Imageimg Image.open(tes…

Java快速提升_java快速复习 一 基础语法

最近看很多算法书,比较不错的有不少都是java语言描述,所以用一天时间快速研究并整理java ,参考资料:java入门经典Call this file "Example2.java".class Example2 {public static void main(String args[]) {int a&…

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

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

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

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

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

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

java useragent 360 遨游 火狐_各种浏览器UserAgent一览表(桌面+移动)

桌面IE而IE各个版本典型的userAgent如下:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)其中&#x…

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

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

python 数组转音频_Python3+将2声道音频,分拆成1声道

现在是将双声道的音频分拆成单声道的。同理可以将多声道的音频文件,转为1声道的音频文件。注意新形成的音频文件的rate,需要与原音频的相同。import osimport waveimport numpy as npimport pyaudiofile1 os.path.join(os.path.abspath(os.path.dirname…

java定义一个矩阵的类_java写入一个矩阵,如何编程求该矩阵的秩

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Fraction.java如下:(这个是网上找来的,处理分数的类)// 支持查找功能的分数类class Fraction implements Comparable {// 分子private int numerator;// 分母private int denominator;// 默认构造函数public Fraction()…

python动态映射_Python Django框架url反向解析实现动态生成对应的url链接示例

本文实例讲述了Python Django框架url反向解析实现动态生成对应的url链接。分享给大家供大家参考,具体如下:url反向解析:根据url路由规则,动态生成对应的url链接 (防止硬编码)。url反向解析应用在两个地方:模板中的超链接&#xff…

java标量替换_JAVA逃逸分析、栈上分配、标量替换、同步消除

一、逃逸分析逃逸分析是编译语言中的一种优化分析,而不是一种优化的手段。通过对象的作用范围的分析,为其他优化手段提供分析数据从而进行优化。逃逸分析包括:全局变量赋值逃逸方法返回值逃逸实例引用发生逃逸线程逃逸:赋值给类变量或可以在其…

python图像人类检测_OpenCV人类行为识别(3D卷积神经网络)

1. 3D卷积神经网络相比于2D 卷积神经网络,3D卷积神经网络更能很好的利用视频中的时序信息。因此,其主要应用视频、行为识别等领域居多。3D卷积神经网络是将时间维度看成了第三维。人类行为识别的实际应用:安防监控。(检测识别异常行为&#x…

Spring Cloud Feign作为HTTP客户端调用远程HTTP服务

如果你的项目使用了SpringCloud微服务技术,那么你就可以使用Feign来作为http客户端来调用远程的http服务。当然,如果你不想使用Feign作为http客户端,也可以使用比如JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client或者Spring的RestTemplate。 那么,为…

java查看weblogic服务器_java判断服务器是那种,例如区分tomcat和weblogic | 学步园

package com.geostar.query.util;import org.apache.log4j.Logger;/*** author likehua* 服务器类型探测* Date 2011/04/13* **/public class ServerUtil {public static final String GERONIMO_CLASS "/org/apache/geronimo/system/main/Daemon.class";public s…

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

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

基于java高校教师管理系统_基于SSM框架下的JAVA高校教师业务水平综合管理系统...

每天记录学习,每天会有好心情。*^_^*今天和一个朋友共同完成了一个高校教师业务水平综合管理系统项目,我们在开发时选用的框架是SSM(MYECLIPSE)框架。我这个朋友知识有限,只会这个框架,哈哈,都是为了方便他。和往常一样…

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

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

在java中原始时间_Java 日期时间

Java 日期时间java.util包提供了Date类来封装当前的日期和时间。 Date类提供两个构造函数来实例化Date对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的微秒数。Date(long millisec)Date对象创建…