java中實現(xiàn)自定義注解方式
一、什么是注解?
注解是一種能被添加到java源代碼中的元數據,方法、類、參數和包都可以用注解來修飾。
注解可以看作是一種特殊的標記,可以用在方法、類、參數和包上,程序在編譯或者運行時可以檢測到這些標記而進行一些特殊的處理。
二、自定義注解需要的基本元素
自定義注解需要用到的東西:
- 修飾符:訪問修飾符必須為
public
,不寫默認為pubic; - 關鍵字:關鍵字為
@interface
; - 注解名稱: 注解名稱為自定義注解的名稱,使用時還會用到;
- 注解類型元素: 注解類型元素是注解中內容,可以理解成自定義接口的實現(xiàn)部分;
public @interface Info { String value() default "tracy"; boolean isDelete(); }
三、自定義注解用到的元注解
JDK中有一些元注解,主要有@Target
,@Retention
,@Document
,@Inherited
用來修飾注解。
- @Target:表明該注解可以應用的java元素類型
- @Retention:表明該注解的生命周期
- @Document:表明該注解標記的元素可以被Javadoc 或類似的工具文檔化
- @Inherited:表明使用了@Inherited注解的注解,所標記的類的子類也會擁有這個注解
@Target({ElementType.FIELD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Info { String value() default "tracy"; boolean isDelete(); }
四、自定義注解的使用
定義一個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對象 People person = People.builder().build(); Class clazz = person.getClass(); //判斷person對象上是否有Info注解 if (clazz.isAnnotationPresent(Define.class)) { System.out.println("People類上配置了Define注解!"); //獲取該對象上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(); } }
打印結果:
People類上配置了Define注解!
person.name :tracy,person.isDelete:true
對于一個類或者接口來說,Class類(java.lang包下)中提供了一些方法用于反射注解,當然對于字段、方法來說反射注解的方式很類似。
//返回指定的注解 getAnnotation //判斷當前元素是否被指定注解修飾 isAnnotationPresent //返回所有的注解 getAnnotations
使用注解注意點:
自定義注解中,設置了默認值的屬性在使用時可以不用定義值,但是沒被設置默認值的屬性使用時一定要定義屬性值。
示例:
如上圖,isTest注解沒有設置默認值,使用Log注解沒定義isTest屬性值會報錯。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
IDEA教程創(chuàng)建SpringBoot前后端分離項目示例圖解
在使用spring、mybatis等框架時,配置文件很復雜,有時復雜的讓人想放棄Java,使用C#。springboot出現(xiàn)這一切問題就都不是問題2021-10-10RocketMQ線程池創(chuàng)建實現(xiàn)原理詳解
這篇文章主要為大家介紹了RocketMQ線程池創(chuàng)建實現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12SpringBoot3整合mybatis-plus的實現(xiàn)
MyBatis-Plus是一個MyBatis的增強工具,在MyBatis的基礎上只做增強不做改變,本文主要介紹了Mybatis-Plus3.x的具體使用,具有一定的參考價值,感興趣的可以了解一下2023-10-10