java中實(shí)現(xiàn)自定義注解方式
一、什么是注解?
注解是一種能被添加到j(luò)ava源代碼中的元數(shù)據(jù),方法、類、參數(shù)和包都可以用注解來(lái)修飾。
注解可以看作是一種特殊的標(biāo)記,可以用在方法、類、參數(shù)和包上,程序在編譯或者運(yùn)行時(shí)可以檢測(cè)到這些標(biāo)記而進(jìn)行一些特殊的處理。
二、自定義注解需要的基本元素
自定義注解需要用到的東西:
- 修飾符:訪問修飾符必須為
public
,不寫默認(rèn)為pubic; - 關(guān)鍵字:關(guān)鍵字為
@interface
; - 注解名稱: 注解名稱為自定義注解的名稱,使用時(shí)還會(huì)用到;
- 注解類型元素: 注解類型元素是注解中內(nèi)容,可以理解成自定義接口的實(shí)現(xiàn)部分;
public @interface Info { String value() default "tracy"; boolean isDelete(); }
三、自定義注解用到的元注解
JDK中有一些元注解,主要有@Target
,@Retention
,@Document
,@Inherited
用來(lái)修飾注解。
- @Target:表明該注解可以應(yīng)用的java元素類型
- @Retention:表明該注解的生命周期
- @Document:表明該注解標(biāo)記的元素可以被Javadoc 或類似的工具文檔化
- @Inherited:表明使用了@Inherited注解的注解,所標(biāo)記的類的子類也會(huì)擁有這個(gè)注解
@Target({ElementType.FIELD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Info { String value() default "tracy"; boolean isDelete(); }
四、自定義注解的使用
定義一個(gè)People類:
@Data @Builder @Define(isDelete = true) public class People { /** * 姓名 */ private String name; /** * 年齡 */ private int age; /** * 是否有效 */ private boolean isDelete; }
自定義注解:
import java.lang.annotation.*; @Target({ElementType.FIELD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Define { String value() default "tracy"; boolean isDelete(); }
利用反射解析注解:
public static void main(String[] args) { try { //獲取Person的Class對(duì)象 People person = People.builder().build(); Class clazz = person.getClass(); //判斷person對(duì)象上是否有Info注解 if (clazz.isAnnotationPresent(Define.class)) { System.out.println("People類上配置了Define注解!"); //獲取該對(duì)象上Info類型的注解 Define infoAnno = (Define) clazz.getAnnotation(Define.class); System.out.println("person.name :" + infoAnno.value() + ",person.isDelete:" + infoAnno.isDelete()); } else { System.out.println("People類上沒有配置Define注解!"); } } catch (Exception e) { e.printStackTrace(); } }
打印結(jié)果:
People類上配置了Define注解!
person.name :tracy,person.isDelete:true
對(duì)于一個(gè)類或者接口來(lái)說(shuō),Class類(java.lang包下)中提供了一些方法用于反射注解,當(dāng)然對(duì)于字段、方法來(lái)說(shuō)反射注解的方式很類似。
//返回指定的注解 getAnnotation //判斷當(dāng)前元素是否被指定注解修飾 isAnnotationPresent //返回所有的注解 getAnnotations
使用注解注意點(diǎn):
自定義注解中,設(shè)置了默認(rèn)值的屬性在使用時(shí)可以不用定義值,但是沒被設(shè)置默認(rèn)值的屬性使用時(shí)一定要定義屬性值。
示例:
如上圖,isTest注解沒有設(shè)置默認(rèn)值,使用Log注解沒定義isTest屬性值會(huì)報(bào)錯(cuò)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot2.0 配置時(shí)間格式化不生效問題的解決
這篇文章主要介紹了springboot2.0 配置時(shí)間格式化不生效問題的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09解決Netty解碼http請(qǐng)求獲取URL亂碼問題
這篇文章主要介紹了解決Netty解碼http請(qǐng)求獲取URL亂碼問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06IDEA教程創(chuàng)建SpringBoot前后端分離項(xiàng)目示例圖解
在使用spring、mybatis等框架時(shí),配置文件很復(fù)雜,有時(shí)復(fù)雜的讓人想放棄Java,使用C#。springboot出現(xiàn)這一切問題就都不是問題2021-10-10RocketMQ線程池創(chuàng)建實(shí)現(xiàn)原理詳解
這篇文章主要為大家介紹了RocketMQ線程池創(chuàng)建實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12SpringBoot3整合mybatis-plus的實(shí)現(xiàn)
MyBatis-Plus是一個(gè)MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,本文主要介紹了Mybatis-Plus3.x的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10