java 自定義注解以及獲得注解的值

1.自定義注解

import java.lang.annotation.*;@Documented
@Target(ElementType.FIELD)
@Inherited
@Retention(RetentionPolicy.RUNTIME )
public @interface MyAnno {/*** 是否能為null* @return*/boolean isCanNull() default true;/*** 是否能為空字符串* @return*/boolean isCanEmpty() default true;/*** 是否能為0* @return*/boolean isCanZero() default true;
}

2.使用注解:

public class Mouse {@MyAnno(isCanNull=true)private  String name;@MyAnno(isCanNull = false,isCanZero = false)private  int age;@MyAnno(isCanNull = false)private String address;@MyAnno(isCanZero = false)private double money;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

3.獲得注解的值并對其判斷

package com.vweb.util;import com.vweb.webapp.Mouse;
import com.vweb.webapp.MyAnno;
import com.vweb.webapp.TestUtil;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;

public class IntactCheckUtil {public static boolean check(Object obj){// list = Arrays.asList(AnnotationParsing.class.getClassLoader().loadClass(((Class)obj).getClass().getName()).getDeclaredFields());List<Field>  list = Arrays.asList(obj.getClass().getDeclaredFields());for(int i=0;i<list.size();i++){Field field = list.get(i);if(field.isAnnotationPresent(MyAnno.class)){//是否使用MyAnno注解for (Annotation anno : field.getDeclaredAnnotations()) {//獲得所有的注解if(anno.annotationType().equals(MyAnno.class) ){//找到自己的注解if(!((MyAnno)anno).isCanNull()){//注解的值if(TestUtil.getFieldValueByName(field.getName(),obj)==null){throw new RuntimeException("類:"+Mouse.class+"的屬性:"+field.getName()+"不能為空,實際的值:"+TestUtil.getFieldValueByName(field.getName(),obj)+",注解:field.getDeclaredAnnotations()");}}if(!((MyAnno)anno).isCanEmpty()){if(TestUtil.getFieldValueByName(field.getName(),obj).equals("")){throw new RuntimeException("類:"+Mouse.class+"的屬性:"+field.getName()+"不能為空字符串,實際的值:"+TestUtil.getFieldValueByName(field.getName(),obj)+",注解:field.getDeclaredAnnotations()");}}if(!((MyAnno)anno).isCanZero()){if(TestUtil.getFieldValueByName(field.getName(),obj).toString().equals("0") || TestUtil.getFieldValueByName(field.getName(),obj).toString().equals("0.0")){throw new RuntimeException("類:"+Mouse.class+"的屬性:"+field.getName()+"不能為空字符0,實際的值:"+TestUtil.getFieldValueByName(field.getName(),obj)+",注解:field.getDeclaredAnnotations()");}}}}}}return  true;}
}

備注:注解各參數的使用(以下內容來自互聯網http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html)

@Target:

   @Target說明了Annotation所修飾的對象范圍:Annotation可被用于 packages、types(類、接口、枚舉、Annotation類型)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(如循環變量、catch參數)。在Annotation類型的聲明中使用了target可更加明晰其修飾的目標。

? ? 取值(ElementType)有:

    1.CONSTRUCTOR:用于描述構造器
    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部變量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述參數
    7.TYPE:用于描述類、接口(包括注解類型) 或enum聲明

@Retention定義了該Annotation被保留的時間長短:某些Annotation僅出現在源代碼中,而被編譯器丟棄;而另一些卻被編譯在class文件中;編譯在class文件中的Annotation可能會被虛擬機忽略,而另一些在class被裝載時將被讀取(請注意并不影響class的執行,因為Annotation與class在使用上是被分離的)。使用這個meta-Annotation可以對 Annotation的“生命周期”限制。

  取值(RetentionPoicy)有:

    1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在運行時有效(即運行時保留)

 @Documented:

  該屬性用于描述其它類型的annotation應該被作為被標注的程序成員的公共API,因此可以被例如javadoc此類的工具文檔化。Documented是一個標記注解,沒有成員。

@Inherited:

  @Inherited 元注解是一個標記注解,@Inherited闡述了某個被標注的類型是被繼承的。如果一個使用了@Inherited修飾的annotation類型被用于一個class,則這個annotation將被用于該class的子類。

  注意:@Inherited annotation類型是被標注過的class的子類所繼承。類并不從它所實現的接口繼承annotation,方法并不從它所重載的方法繼承annotation。

  當@Inherited annotation類型標注的annotation的Retention是RetentionPolicy.RUNTIME,則反射API增強了這種繼承性。如果我們使用java.lang.reflect去查詢一個@Inherited annotation類型的annotation時,反射代碼檢查將展開工作:檢查class和其父類,直到發現指定的annotation類型被發現,或者到達類繼承結構的頂層。

自定義注解:

  使用@interface自定義注解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其他細節。在定義注解時,不能繼承其他的注解或接口。@interface用來聲明一個注解,其中的每一個方法實際上是聲明了一個配置參數。方法的名稱就是參數的名稱,返回值類型就是參數的類型(返回值類型只能是基本類型、Class、String、enum)。可以通過default來聲明參數的默認值。

  定義注解格式:
  public?@interface 注解名 {定義體}

  注解參數的可支持數據類型:

    1.所有基本數據類型(int,float,boolean,byte,double,char,long,short)
    2.String類型
    3.Class類型
    4.enum類型
    5.Annotation類型
    6.以上所有類型的數組

  Annotation類型里面的參數該怎么設定:?
  第一,只能用public或默認(default)這兩個訪問權修飾.例如,String value();這里把方法設為defaul默認類型;   
  第二,參數成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數據類型和 String,Enum,Class,annotations等數據類型,以及這一些類型的數組.例如,String value();這里的參數成員就為String;  
  第三,如果只有一個參數成員,最好把參數名稱設為"value",后加小括號.例:下面的例子FruitName注解就只有一個參數成員。

  簡單的自定義注解和使用注解實例:

    

轉載于:https://www.cnblogs.com/mouseIT/p/5033746.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272637.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272637.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272637.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux列出管道,lsof列出的管道列表示什么意思?_linux_開發99編程知識庫

文件不僅以流形式打開。 其中一些是在 lsof 手冊中列出的&#xff1a;FD is the File Descriptor number of the file or:cwd current working directory;Lnn library references (AIX);err FD information error (see NAME column);jld jail directory (FreeBSD);ltx shared l…

CSS一些實用的技巧

css 字體簡寫規則當使用css定義字體時你可能會這樣做&#xff1a;font-size: 1em;line-height: 1.5em;font-weight: bold;font-style: italic;font-variant: small-caps;font-family: verdana,serif;事實上你可以簡寫這些屬性&#xff1a;font: 1em/1.5em bold italic small-ca…

linux openssh升級8.1,Centos7利用rpm升級OpenSSH到openssh-8.1p1版本

由于近期安全事故頻發&#xff0c;打算把機器OpenSSH升級到最新版本&#xff0c;找了一圈&#xff0c;發現分享的rpm包就到7.4版本&#xff0c;最新版已經到8.1.p1&#xff0c;所以博客自編譯一個openssh-8.1p1的rpm包進行分享。檢查環境&#xff1a;[roottest]# ssh -VOpenSSH…

《HTTP權威指南》 – 11.驗證碼和新鮮度

服務器應當告知客戶端能夠將內容緩存多長時間&#xff0c;在這個時間內就是新鮮的。服務器可以用這兩個首部之一來提供信息&#xff1a; Expires&#xff08;過期&#xff09;Cache - Control&#xff08;緩存控制&#xff09;Expires首部 規定文檔“過期”的具體時間&#xff…

產品經理必備神器推薦

歡迎關注我的公眾號&#xff08;同步更新文章&#xff09;&#xff1a;DoNet技術分享平臺閱讀原文工欲善其事&#xff0c;必先利其器&#xff0c;作為最追求極致體驗的產品經理群體&#xff0c;手里有一件趁手的法器&#xff0c;工作起來才會有一種享受般的快感&#xff0c;最近…

野火linux底板設計,野火STM32F767套件(底板+核心板)

一、兌換形式1、電子芯吧客注冊用戶均可通過免費申請與硬件兌換兩種方式進行申請試用2、免費申請形式為用戶通過分享試用活動至好友&#xff0c;換取申請板卡一次試用資格3、硬件兌換方式為用戶捐贈一塊閑置板卡至電子芯吧客&#xff0c;換取申請板卡一次試用資格4、免費申請渠…

c++ builder xe2 (Embarcadero rad studio) 遠程調試 同樣適用于 delphi 遠程調試 教程

c builder xe2 &#xff08;Embarcadero rad studio&#xff09; 遠程調試 同樣適用于 delphi 遠程調試 教程轉載于:https://www.cnblogs.com/LittleTiger/p/5039245.html

JS關閉瀏覽器 (不彈出提示框)

如果網頁不是通過腳本程序打開的&#xff08;window.open()&#xff09;&#xff0c;調用window.close()腳本關閉窗口前&#xff0c;必須先將window.opener對象置為null&#xff0c;否則瀏覽器&#xff08;IE7、IE8&#xff09;會彈出一個確定關閉的對話框。&#xff1c;script…

天大18年c語言離線作業,天大18秋C語言程序設計在線作業一輔導資料.docx-資源下載在線文庫www.lddoc.cn...

天大18秋《C語言程序設計》在線作業一輔導資料.docx天大 18 秋C 語言程序設計 在線作業一1、C 2、D 3、D 4、D 5、D 一、單選題共 40 題&#xff0c;100 分1、設有int a 31,0,3,3,4,5,6,7;,則 a21的值是 A3B5C6D4正確答案是C2、設 int a21,b021; 語句 printf“x,dn”,a,b;的輸出…

AM335x(TQ335x)學習筆記——GPIO關鍵驅動移植

或按照S5PV210學習秩序。我們首先解決的關鍵問題。TQ335x有六個用戶按鈕&#xff0c;每個上、下、剩下、對、Enter和ESC。我想開始學習S5PV210當同一&#xff0c;寫輸入子系統驅動器的關鍵問題要解決&#xff0c;但瀏覽driver/input/keyboardgpio-keys.c&#xff0c;大體上看下…

程序員偷偷深愛的9個不良編程習慣

新媒體管家下面這9個編碼習慣&#xff0c;雖然在編程規則中是被駁斥的&#xff0c;但我們很多人就是會不由自主地使用它們。我們曾經都做過這樣的事情&#xff1a;當媽媽不注意的時候&#xff0c;偷偷地吃糖果零食&#xff0c;然后導致有了蛀牙。同樣的&#xff0c;我們都違背過…

emacs c語言 自動補全,Emacs 與 C/C++ 代碼自動補全

基于 Emacs 的 company 模式并配合 semantic 文法分析器&#xff0c;實現 Emacs 的 C/C 代碼自動補全。關于 Emacs 的代碼自動補全代碼自動補全的功能&#xff0c;對于使用 Emacs 寫代碼的程序員而言其重要性不言而喻的&#xff0c;但是搜了一些所謂的 “Emacs 完美的 C 自動補…

linux(fedora) 下dvwa 建筑環境

linux(fedora)下dvwa組態 1.下載httpd,dvwa,mysql,mysqlserver, php-mysql,php 除了dvwa 這是外界進入下一官方網站。該服務通過休息install 安裝 yum install httpd, mysql, php-mysql, php 假設出現安裝的問題。能夠先yum search xxx 2.安裝完之后&#xff0c;檢查安裝的狀…

c語言一元二次方程 ii(分支嵌套),C程序設計——求一元二次方程算法

要求&#xff1a;從鍵盤上輸入一元二次方程的三個參數&#xff0c;編程判斷并求一元二次方程的實根(a,b,c均為整數)算法分析&#xff1a;一元二次方程是只含有一個未知數&#xff0c;且未知數的最高次數是二次的多項式方程。一元二次方程經過整理都可化成一般形式axbxc0(a≠0)&…

程序員如何優雅度過一生的15個建議

首先&#xff0c;我要說明一下精彩的職業生涯應該是什么樣。他們不是這樣的一個線性圖形&#xff0c;不是每過一個月你就會有對應的成長。&#xff08;就算是普通的職業生涯也不會這樣。你不會每個月都有提升。每個月你都會變的好一點&#xff0c;但是每次有提升都是大幅度的&a…

cocos2d-x游戲開發 跑酷(四) 關聯與物理世界

原創。轉載注明出處http://blog.csdn.net/dawn_moon/article/details/21451077 前面一節盡管實現了一個跑動的人物&#xff0c;可是他只不過一個精靈在運行一個跑動的幀動畫而已。這一節我要實現精靈和物理世界關聯。讓這個人跟實際的Parkour一樣&#xff0c;有實際體積&#x…

kmp算法的c語言,KMP算法 純C實現

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓我自己寫的KMP算法&#xff1a;int nt[256];void get_next1(char* T, int next[], int tlen){int i 0;int j 1;next[0] -1;while( j {if ( T[i] T[j] ){next[j] 0;i;}else{next[j] i;i 0;}j;}}int Index_KMP1(char* S, cha…

MyBatis多條件查詢

1.MyBatis多條件查詢1.1&#xff1a;使用實體類 將參數封裝成對象接口&#xff1a;public List<User> getUserListByUser(User user);Mapper映射文件&#xff1a;<select id"getUserListByUser" resultType"User" parameterType"User"…

android 定位 廣播,android - 如何觸發廣播接收器在GPS開啟/關閉? - SO中文參考 - www.soinside.com...

如何觸發廣播接收器在GPS開啟/關閉&#xff1f;問題描述 投票&#xff1a;35回答&#xff1a;5public class BootReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().matches("android.locatio…

sphinx數據文件簡析

Sphinx使用的文件包括 “sph”&#xff0c; “spa”&#xff0c; “spi”&#xff0c; “spd”, “spp”&#xff0c; “spm” &#xff0c;還有鎖文件&#xff08;.spl&#xff09;。其中sph是系統的配置文件。其它則為索引文件。 l Spi 文件&#xff1a;保存WordId及指向此Wo…