日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

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

發(fā)布時(shí)間:2024/9/27 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 多重注解_Java注解-元数据、注解分类、内置注解和自定义注解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家好,我是樂字節(jié)的小樂,上次說過了Java多態(tài)的6大特性|樂字節(jié),接下來我們來看看Java編程里的注解。

Java注解有以下幾個(gè)知識(shí)點(diǎn):元數(shù)據(jù)

注解的分類

內(nèi)置注解

自定義注解

注解處理器

Servlet3.0

本文先介紹前面4個(gè)知識(shí)點(diǎn):元數(shù)據(jù)、注解的分類、內(nèi)置注解、自定義注解。

一、注解簡介

注解是Java 1.5引入的,目前已被廣泛應(yīng)用于各種Java框架,如Hibernate,Jersey,

Spring。注解相當(dāng)于是一種嵌入在程序中的元數(shù)據(jù),可以使用注解解析工具或編譯器對(duì)

其進(jìn)行解析,也可以指定注解在編譯期或運(yùn)行期有效。

在注解誕生之前,程序的元數(shù)據(jù)存在的形式僅限于java注釋或javadoc,但注解可以提

供更多功能,它不僅包含元數(shù)據(jù),還能作用于運(yùn)行期,注解解析器能夠使用注解決定處

理流程。

Annotation(注解)就是Java提供了一種元程序中的元素關(guān)聯(lián)任何信息和任何元數(shù)據(jù)

(metadata)的途徑和方法。Annotation是一個(gè)接口,程序可以通過反射來獲取指定

程序元素的Annotation對(duì)象,然后通過Annotation對(duì)象來獲取注解里面的元數(shù)據(jù)。

注解API非常強(qiáng)大,被廣泛應(yīng)用于各種Java框架,如Spring,Hibernate,JUnit。

二、 元數(shù)據(jù)metadata

元數(shù)據(jù)從metadata一詞譯來,就是“關(guān)于數(shù)據(jù)的數(shù)據(jù)”的意思,即描述數(shù)據(jù)的結(jié)構(gòu)信息。元數(shù)據(jù)的功能作用有很多,比如:你可能用過Javadoc的注釋自動(dòng)生成文檔。這就是元數(shù)據(jù)功能的一種。總的來說,元數(shù)據(jù)可以用來創(chuàng)建文檔,跟蹤代碼的依賴性,執(zhí)行編譯時(shí)格式檢查,代替已有的配置文件。

在Java中元數(shù)據(jù)以標(biāo)簽的形式存在于Java代碼中,元數(shù)據(jù)標(biāo)簽的存在并不影響程序代碼的編譯和執(zhí)行,被用來生成其它的文件或只在運(yùn)行時(shí)知道被運(yùn)行代碼的描述信息。

其作用如下:

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

② 跟蹤代碼依賴性,實(shí)現(xiàn)替代配置文件功能。常見的是spring 2.5 開始的基于注解配置。作用就是減少配置。現(xiàn)在的框架基本都使用了這種配置來減少配置文件的數(shù)量。;

③在編譯時(shí)進(jìn)行格式檢查。如@override 放在方法前,如果你這個(gè)方法并不是覆蓋了超類方法,則編譯時(shí)就能檢查出。

三、 注解的分類

根據(jù)注解參數(shù)的個(gè)數(shù):

1)、標(biāo)記注解:一個(gè)沒有成員定義的Annotation類型被稱為標(biāo)記注解。

2)、單值注解:只有一個(gè)值

3)、完整注解:擁有多個(gè)值

根據(jù)注解使用方法和用途:

1)、JDK內(nèi)置系統(tǒng)注解

2)、元注解

3)、自定義注解

四、 內(nèi)置注解

JavaSE中內(nèi)置三個(gè)標(biāo)準(zhǔn)注解,定義在java.lang中:

@Override

限定重寫父類方法,若想要重寫父類的一個(gè)方法時(shí),需要使用該注解告知編譯器我們正在重寫一個(gè)方法。如此一來,當(dāng)父類的方法被刪除或修改了,編譯器會(huì)提示錯(cuò)誤信息;或者該方法不是重寫也會(huì)提示錯(cuò)誤。

public interface Car {

void run();

}

class QQ implements Car{

@Override

public void run() {}

}

class Bmw implements Car{

@Override

void run() {}

}復(fù)制代碼

QQ 類編譯不會(huì)有任何問題,Bmw類在編譯的時(shí)候會(huì)提示相應(yīng)的錯(cuò)誤。父類中省略了public abstract修飾符。@Override注解只能用于方法,不能用于其他程序元素。

@Deprecated

標(biāo)記已過時(shí),當(dāng)我們想要讓編譯器知道一個(gè)方法已經(jīng)被棄用(deprecate)時(shí),應(yīng)該使用這個(gè)注解。Java推薦在javadoc中提供信息,告知用戶為什么這個(gè)方法被棄用了,以及替代方法是什么;

/**

* Deprecated -->該方法過時(shí)(有更好的解決方案)

* @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)");

}

}復(fù)制代碼

3. @SuppressWarnings

抑制編譯器警告,該注解僅僅告知編譯器,忽略它們產(chǎn)生了特殊警告。如:在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();

}

}復(fù)制代碼

五、 自定義注解

1、簡單入門

@interface:用來聲明一個(gè)注解。注解類里的每一個(gè)方法實(shí)際上是聲明了一個(gè)配置參數(shù)。方法的名稱就是參數(shù)的名稱,返回值類型就是參數(shù)的類型。可以通過default來聲明參數(shù)的默認(rèn)值。

@interface Simple{

//這里定義了一個(gè)空的注解,它能干什么呢?我也不知道,但他能用。后面有補(bǔ)充

}復(fù)制代碼

2、元注解

元注解的作用就是負(fù)責(zé)注解其他注解。Java5.0定義了4個(gè)標(biāo)準(zhǔn)的meta-annotation類型,它們被用來提供對(duì)其它 annotation類型作說明。Java5.0定義的元注解有四個(gè),

這些類型和它們所支持的類在java.lang.annotation包中可以找到。

@Target

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

取值(ElementType)有:

1.CONSTRUCTOR:用于描述構(gòu)造器

2.FIELD:用于描述域

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

4.METHOD:用于描述方法

5.PACKAGE:用于描述包

6.PARAMETER:用于描述參數(shù)

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

此時(shí)在空注解中加入@Target元注解如:

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

@Target(ElementType.METHOD)

@interface TestMethod {}復(fù)制代碼

@Retention

表示需要在什么級(jí)別保存該注釋信息,用于描述注解的生命周期(即:被描述的注解在什么范圍內(nèi)有效)表示注解類型保留時(shí)間的長短。

取值(RetentionPoicy)有:

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

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

3.RUNTIME:在運(yùn)行時(shí)有效(即運(yùn)行時(shí)保留)

此時(shí)在上述注解中加入@Retention元注解如:

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

@Target(ElementType.TYPE)

//該注解運(yùn)行時(shí)有效。注解處理器可以通過反射,獲取到該注解的屬性值,從而去做一些運(yùn)行時(shí)的邏輯處理

@Retention(RetentionPolicy.RUNTIME)

@interface TestRn{

}復(fù)制代碼

@Documented

表示使用該注解的元素應(yīng)被javadoc或類似工具文檔化,它應(yīng)用于類型聲明,類型聲明的注解會(huì)影響客戶端對(duì)注解元素的使用。如果一個(gè)類型聲明添加了Documented注解,那么它的注解會(huì)成為被注解元素的公共API的一部分,@Documented是一個(gè)標(biāo)記注解。

//可以被例如javadoc此類的工具文檔化

@Documented

@interface TestDoc{

}復(fù)制代碼

@Inherited

表示一個(gè)注解類型會(huì)被自動(dòng)繼承,如果用戶在類聲明的時(shí)候查詢注解類型,同時(shí)類聲明中也沒有這個(gè)類型的注解,那么注解類型會(huì)自動(dòng)查詢?cè)擃惖母割?#xff0c;這個(gè)過程將會(huì)不停地重復(fù),直到該類型的注解被找到為止,或是到達(dá)類結(jié)構(gòu)的頂層(Object)。

//被子類繼承的注解

@Inherited

@interface TestInheri{}復(fù)制代碼

3、深入自定義注解

使用@interface自定義注解時(shí),自動(dòng)繼承了java.lang.annotation.Annotation接口,由編譯程序自動(dòng)完成其他細(xì)節(jié)。在定義注解時(shí),不能繼承其他的注解或接口。

⑴定義注解格式:

@interface用來聲明一個(gè)注解,其中的每一個(gè)方法實(shí)際上是聲明了一個(gè)配置參數(shù)。方法的名稱就是參數(shù)的名稱,返回值類型就是參數(shù)的類型(返回值類型只能是基本類型、Class、String、enum)。可以通過default來聲明參數(shù)的默認(rèn)值。

public @interface 注解名{定義體s}

⑵注解參數(shù)(即方法)

注解里面的每一個(gè)方法實(shí)際上就是聲明了一個(gè)配置參數(shù),其規(guī)則如下:

①修飾符

只能用public或默認(rèn)(default)這兩個(gè)訪問權(quán)修飾 ,默認(rèn)為default

②類型

注解參數(shù)只支持以下數(shù)據(jù)類型:

基本數(shù)據(jù)類型(int,float,boolean,byte,double,char,long,short);

String類型;

Class類型;

enum類型;

Annotation類型;

以上所有類型的數(shù)組

③命名

對(duì)取名沒有要求,如果只有一個(gè)參數(shù)成員,最好把參數(shù)名稱設(shè)為"value",后加小括號(hào)。

④參數(shù)

注解中的方法不能存在參數(shù)

⑤默認(rèn)值

可以包含默認(rèn)值,使用default來聲明默認(rèn)值。

⑶實(shí)例如下

/*

* 碼農(nóng)定義注解

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@interface Programmer{

String value() default "馬云";

}

/**

* 碼農(nóng)類型注解

* @author peida

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@interface ProgrammerType {

/**

* 類型枚舉 程序猿 射雞師

*/

public enum CoderType{MONKEYS,LION,CHOOK};

/**

* 顏色屬性

*/

CoderType type() default CoderType.MONKEYS;

}

/**

* 碼農(nóng)制造廠

* @author Administrator

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@interface ProgrammerProductor {

/**

* 廠家編號(hào)

* @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;

}

}

樂字節(jié)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處復(fù)制代碼

總結(jié)

以上是生活随笔為你收集整理的java 多重注解_Java注解-元数据、注解分类、内置注解和自定义注解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。