Java中自定義注解類(lèi)及使用實(shí)例解析
這篇文章主要介紹了Java中自定義注解類(lèi)并使用過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
在Java框架中,經(jīng)常會(huì)使用注解,而且還可以省很多事,來(lái)了解下自定義注解。
注解是一種能被添加到j(luò)ava代碼中的元數(shù)據(jù),類(lèi)、方法、變量、參數(shù)和包都可以用注解來(lái)修飾。注解對(duì)于它所修飾的代碼并沒(méi)有直接的影響
先寫(xiě)一個(gè)自己的注解類(lèi)
@Documented //會(huì)被javadoc命令識(shí)別 @Retention(RetentionPolicy.RUNTIME) //相當(dāng)于作用時(shí)期,比如:運(yùn)行期、編譯期 @Target({ElementType.METHOD}) //相當(dāng)于作用域,比如方法、類(lèi) public @interface MyValue { String value(); //也可以這么寫(xiě),就是說(shuō),它的默認(rèn)值是hello //String value() default "hello"; }
然后解析上邊用到的那兩個(gè)類(lèi):
public enum RetentionPolicy { SOURCE, CLASS, RUNTIME }
public enum ElementType { /** Class, interface (including annotation type), or enum declaration */ TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE }
可以看到,是兩個(gè)枚舉類(lèi),也就是我們自定義的注解有一定的時(shí)間和空間作用域。
好了,我們的自定義注解已經(jīng)完成了(對(duì)的,自定義注解就上邊那一段代碼),那我們就來(lái)看看要怎么有用呢?很容易啊,就和其他的注解一樣,寫(xiě)在我們要用到的地方就好了。(對(duì)的,我確定不是在開(kāi)玩笑)
public class Person { @MyValue(value="張三") private String name; /* 為什么要寫(xiě)setter和getter,很快你就會(huì)知道 */ public String getName() { return name; } public void setName(String name) { this.name = name; } }
然后我們?cè)谄渌胤饺ツ?/p>
Person person = new Person(); System.out.println(person.getName());//null //這就很難受,按道理來(lái)說(shuō),不是應(yīng)該是張三嗎?
大家都知道,像Spring這種框架都是通過(guò)反射來(lái)實(shí)現(xiàn)的,我們就模擬一個(gè)“編譯類(lèi)”,我們是在屬性上用的注解,所以就先用反射來(lái)拿到類(lèi)的所有屬性
public static void main(String[] args) throws NoSuchFieldException { Person person = new Person(); //按理來(lái)說(shuō),我們是拿到這個(gè)Person.class的所有的屬性,然后遍歷,來(lái)挨個(gè)注入,但是這里我們明明確我們的屬性名,所以就簡(jiǎn)單化了 Field field = Person.class.getDeclaredField("name"); MyValue annotation = field.getAnnotation(MyValue.class);//拿到注解類(lèi) String name = annotation.value();//這個(gè)value()就是我們?cè)贛yValue類(lèi)中的的屬性 //然后我們就注入到這個(gè)類(lèi)中,這時(shí)就用到了setter方法 person.setName(name); System.out.println("通過(guò)自定義注解后的person的name是:" + person.getName()); }
是的,這樣我們就通過(guò)了自定義注解給Person注入了一個(gè)name屬性,但是在實(shí)際運(yùn)用中不可能這么復(fù)雜,這只是入門(mén)了一下,我們可以將這個(gè)“模擬的編譯類(lèi)”組裝成一個(gè)工具類(lèi),以便我們?cè)趯?shí)際中運(yùn)用。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot配置@Configuration注解和@bean注解
這篇文章主要介紹了SpringBoot配置@Configuration注解和@bean注解,文章圍繞主題相關(guān)內(nèi)容展開(kāi)詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04Spring Boot 集成 Kafkad的實(shí)現(xiàn)示例
這篇文章主要介紹了Spring Boot 集成 Kafkad的示例,幫助大家更好的理解和學(xué)習(xí)使用Spring Boot框架,感興趣的朋友可以了解下2021-04-04手?jǐn)]一個(gè)Spring?Boot?Starter并上傳到Maven中央倉(cāng)庫(kù)
本文主要介紹了手?jǐn)]一個(gè)Spring?Boot?Starter并上傳到Maven中央倉(cāng)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05Java原子變量類(lèi)常見(jiàn)問(wèn)題解決
這篇文章主要介紹了Java原子變量類(lèi)常見(jiàn)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03SpringBoot整合RabbitMQ實(shí)現(xiàn)六種工作模式的示例
這篇文章主要介紹了SpringBoot整合RabbitMQ實(shí)現(xiàn)六種工作模式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07Mybatis入門(mén)指南之實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)增刪改查
數(shù)據(jù)持久層主要負(fù)責(zé)數(shù)據(jù)的增、刪、改、查等功能,MyBatis 則是一款優(yōu)秀的持久層框架,下面這篇文章主要給大家介紹了關(guān)于Mybatis入門(mén)指南之實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)增刪改查的相關(guān)資料,需要的朋友可以參考下2022-10-10Java面向?qū)ο笾^承、構(gòu)造方法、重寫(xiě)、重載
本章具體介紹了什么是構(gòu)造方法、繼承、重寫(xiě)、重載以及創(chuàng)建方法,整篇文章用老司機(jī)和人類(lèi)來(lái)舉例,圖解穿插代碼案例,需要的朋友可以參考下2023-03-03Spring Boot整合JWT的實(shí)現(xiàn)步驟
本文主要介紹了Spring Boot整合JWT,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08