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.pswp.cn/news/528963.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/528963.shtml
英文地址,請注明出處:http://en.pswp.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對象創建…