帶有自定義注釋的Java注釋教程

Java注釋提供有關代碼的信息,并且它們對所注釋的代碼沒有直接影響。 在本教程中,我們將學習Java注釋,如何編寫自定義注釋 ,注釋用法以及如何使用反射來解析注釋

注釋是在Java 1.5中引入的,現在它已在Hibernate, Jersey和Spring等Java框架中大量使用。 注釋是有關嵌入在程序本身中的程序的元數據。 可以通過注釋解析工具或編譯器進行解析。 我們還可以指定注釋可用性以僅編譯時間或也可以直到運行時。

在注釋之前,可以通過java注釋或javadoc獲得程序元數據,但是注釋提供的功能更多。 它不僅包含元數據,而且還可以將其提供給運行時使用,并且注釋解析器可以使用它來確定流程。 例如,在Jersey網絡服務中,我們將帶有URI字符串的PATH注釋添加到方法中,并且在運行時jersey對其進行解析,以確定要為給定URI模式調用的方法。

在Java中創建自定義注釋

創建自定義注釋與編寫接口相似,不同之處在于它的接口關鍵字以@符號為前綴。 我們可以在注解中聲明方法。 讓我們看一下注釋示例,然后我們將討論其功能。

package com.journaldev.annotations;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo{String author() default 'Pankaj';String date();int revision() default 1;String comments();
}
  • 注釋方法不能有參數。
  • 注釋方法的返回類型僅限于原語,字符串,枚舉,注釋或它們的數組。
  • 注釋方法可以具有默認值。
  • 批注可以附加元批注。 元注釋用于提供有關注釋的信息。 元注釋有四種類型:
    1. @Documented –指示使用此注釋的元素應由javadoc和類似工具記錄。 此類型應用于注釋其注釋會影響其客戶端對已注釋元素的使用的類型的聲明。 如果類型聲明用Documented進行注釋,則其注釋將成為帶注釋元素的公共API的一部分。
    2. @Target –指示注釋類型適用的程序元素的種類。 一些可能的值是TYPE,METHOD,CONSTRUCTOR,FIELD等。如果沒有Target元注釋,則可以在任何程序元素上使用注釋。
    3. @Inherited –表示注釋類型是自動繼承的。 如果用戶在類聲明中查詢注釋類型,并且該類聲明中沒有該類型的注釋,則將自動查詢該類的超類以獲取注釋類型。 重復此過程,直到找到該類型的注釋,或到達類層次結構(對象)的頂部為止。
    4. @Retention –指示帶注釋類型的注釋將保留多長時間。 它采用RetentionPolicy參數,其可能值為SOURCE,CLASS和RUNTIME


Java內置注釋

Java提供了三個內置注釋。

  1. @Override –當我們要重寫超類的方法時,應使用此批注通知編譯器我們正在重寫方法。 因此,當刪除或更改超類方法時,編譯器將顯示錯誤消息。
  2. @Deprecated –當我們希望編譯器知道某個方法已被棄用時,應使用此注釋。 Java建議在javadoc中,我們應提供有關為什么不贊成使用此方法以及可以使用什么替代方法的信息。
  3. @SuppressWarnings –這只是告訴編譯器忽略它們產生的特定警告,例如在泛型中使用原始類型。 它的保留策略是SOURCE,并且被編譯器丟棄。

讓我們看一個Java示例,它顯示內置注釋的用法以及在上面的示例中由我們創建的自定義注釋的用法。

package com.journaldev.annotations;import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;public class AnnotationExample {public static void main(String[] args) {}@Override@MethodInfo(author = 'Pankaj', comments = 'Main method', date = 'Nov 17 2012', revision = 1)public String toString() {return 'Overriden toString method';}@Deprecated@MethodInfo(comments = 'deprecated method', date = 'Nov 17 2012')public static void oldMethod() {System.out.println('old method, don't use it.');}@SuppressWarnings({ 'unchecked', 'deprecation' })@MethodInfo(author = 'Pankaj', comments = 'Main method', date = 'Nov 17 2012', revision = 10)public static void genericsTest() throws FileNotFoundException {List l = new ArrayList();l.add('abc');oldMethod();}}

我相信示例是自我解釋,并顯示了在不同情況下使用注釋的情況。

Java注解解析

我們將使用Reflection來解析類中的Java批注。 請注意,注釋保留策略應為RUNTIME,否則其信息將在運行時不可用,我們將無法從中獲取任何數據。

package com.journaldev.annotations;import java.lang.annotation.Annotation;
import java.lang.reflect.Method;public class AnnotationParsing {public static void main(String[] args) {try {for (Method method : AnnotationParsing.class.getClassLoader().loadClass(('com.journaldev.annotations.AnnotationExample')).getMethods()) {// checks if MethodInfo annotation is present for the methodif (method.isAnnotationPresent(com.journaldev.annotations.MethodInfo.class)) {try {// iterates all the annotations available in the methodfor (Annotation anno : method.getDeclaredAnnotations()) {System.out.println('Annotation in Method ''+ method + '' : ' + anno);}MethodInfo methodAnno = method.getAnnotation(MethodInfo.class);if (methodAnno.revision() == 1) {System.out.println('Method with revision no 1 = '+ method);}} catch (Throwable ex) {ex.printStackTrace();}}}} catch (SecurityException | ClassNotFoundException e) {e.printStackTrace();}}}

上面程序的輸出是:

Annotation in Method 'public java.lang.String com.journaldev.annotations.AnnotationExample.toString()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=Main method, date=Nov 17 2012)
Method with revision no 1 = public java.lang.String com.journaldev.annotations.AnnotationExample.toString()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @java.lang.Deprecated()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=deprecated method, date=Nov 17 2012)
Method with revision no 1 = public static void com.journaldev.annotations.AnnotationExample.oldMethod()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.genericsTest() throws java.io.FileNotFoundException' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=10, comments=Main method, date=Nov 17 2012)

Java注釋教程就這些了,我希望您從中學到了一些東西。

參考: 帶有自定義注釋示例的Java注釋教程,以及來自JCG合作伙伴 Pankaj Kumar的《 使用反射進行解析》 ,位于Developer Recipes博客上。

翻譯自: https://www.javacodegeeks.com/2012/11/java-annotations-tutorial-with-custom-annotation.html

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

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

相關文章

mybatis通用mapper_全網最全Mapper解析,附實操代碼幫你更好理解

今天給大家介紹一位老朋友當你第一次接觸Java開發的時候,這個老朋友就和你形影不離,當你要進行ORM的時候,單表的增刪改查,這位老朋友給了你極大的幫助,不知道你想到他了嗎?對,這就是通用mapper&…

初嘗微信小程序2-基本框架

基本框架: .wxml :頁面骨架 .wxss :頁面樣式 .js :頁面邏輯 描述一些行為 .json :頁面配置 創建一個小程序之后,app.js,app.json,app.wxss是必須的,而且名字也不能隨意更改,…

JSP內置對象,動作,指令總結

總的來說關于JSP界面有九大內置對象,7大動作,三大指令,現在博主就將這些粘貼出來,此文是很久前整理的學習筆記,如有雷同請諒解! jsp九大內置對象:1>out 向客戶端輸出數據,字節流.如out.print(" dgaweyr"); 2>request 接收客戶端的http請求.String getParameter…

洛谷 P1795 無窮的序列_NOI導刊2010提高(05)

P1795 無窮的序列_NOI導刊2010提高(05) 題目描述 有一個無窮序列如下: 110100100010000100000… 請你找出這個無窮序列中指定位置上的數字 輸入輸出格式 輸入格式:第一行一個正整數N,表示詢問次數; 接下來的…

java 取字符串中的數字_java截取字符串中的數字

隨便給你一個含有數字的字符串,比如:String s"eert343dfg56756dtry66fggg89dfgf";那我們如何把其中的數字提取出來呢?大致有以下幾種方法,正則表達式,集合類,還有就是String類提供的方法。1 Stri…

番石榴的對象類:Equals,HashCode和ToString

如果您有幸使用JDK 7 ,那么新的可用Objects類 ( 至少對我來說 )是實現“通用” Java對象方法(例如equals(Object) [with Objects.equals(Object,Object ) ], …

此服務器的時鐘與主域控制器的時鐘不一致_中移動“超高精度時間同步服務器”開標,兩家中標...

8月25日,中國移動發布《2020年至2022年同步網設備集中采購_中標候選人公示》公告。兩家中標。同步網技術比較小眾,但是同步網是5G承載網的重要一環,分享一下,供大家參考。中標情況 標包1-時鐘同步設備中標候選人依次排序為&#x…

java 異常管理員_GitHub - kangZan/JCatch: Exception異常管理平臺,支持Java、PHP、Python等多種語言...

什么是JCatch當程序發生異常(Exception),處理方式一般是通過日志文件記錄下來,這種方式很容易被忽略,而且查詢起來比較麻煩。JCatch提供了一種方案,當程序發生異常時,通過JCatch平臺接口提交到JCatch平臺,由…

oled

gnd、vcc、clk、miso、rst、mosi、cs 轉載于:https://www.cnblogs.com/scrazy/p/7892733.html

使用html css js實現計算器

使用html css js實現計算器&#xff0c;開啟你的計算之旅吧 效果圖&#xff1a; 代碼如下&#xff0c;復制即可使用&#xff1a; <!DOCTYPE html><html lang"en"> <head> <meta charset"utf-8"> <style> /* 主體 */ .co…

面向對象的三個基本特征

面向對象的三個基本特征是&#xff1a;封裝、繼承、多態。封裝 封裝最好理解了。封裝是面向對象的特征之一&#xff0c;是對象和類概念的主要特性。封裝&#xff0c;也就是把客觀事物封裝成抽象的類&#xff0c;并且類可以把自己的數據和方法只讓可信的類或者對象操作&#xff…

Spring構造函數注入和參數名稱

在運行時&#xff0c;除非在啟用了調試選項的情況下編譯類&#xff0c;否則Java類不會保留構造函數或方法參數的名稱。 這對于Spring構造函數注入有一些有趣的含義。 考慮以下簡單的類 package dbg; public class Person {private final String first;private final String …

java學習文檔_資深程序員帶你深入了解JAVA知識點,實戰篇,PDF文檔

JAVA 集合JAVA 集合面對浩瀚的網絡學習資源&#xff0c;您是否為很難找到適合自己的學習資源而感到苦惱過&#xff1f;那么&#xff0c;您來對地方了。在這里我們幫助大家整理了一份適于輕松學習 Java 文章的清單。JVM文字太多&#xff0c;不便之處敬請諒解JAVA 集合文字太多&a…

java程序員電影_Java程序員必看電影:Java 4-ever

(Scene: A father and his son playing "throw-and-catch")(場景: 一位父親和兒子玩丟接球游戲)Narrator: They appear to be a perfect family旁白: 他們看起來像是一個完美的家庭(Scene: bedtime story)(場景: 床邊故事)Father: Export all OLE objects with the c…

深入理解softmax函數

Softmax回歸模型&#xff0c;該模型是logistic回歸模型在多分類問題上的推廣&#xff0c;在多分類問題中&#xff0c;類標簽 可以取兩個以上的值。Softmax模型可以用來給不同的對象分配概率。即使在之后&#xff0c;我們訓練更加精細的模型時&#xff0c;最后一步也需要用soft…

《第二章:深入了解超文本》

從本章開始要去除無用的話&#xff0c;只在筆記中記載要點----- 使用<a>元素創建一個超文本鏈接&#xff0c;鏈接到另一個Web頁面。 <a>元素的內容會成為Web頁面中可單擊的文本。 href屬性告訴瀏覽器鏈接的目標文件。 了解屬性 例&#xff1a;style的type屬性指定…

strcpy函數_錯誤更正(拷貝賦值函數的正確使用姿勢)

這是一篇對什么是C的The Rule of Three的錯誤更正和詳細說明。閱讀時間7分鐘。難度???雖然上一篇文章的閱讀量只有凄慘的兩位數&#xff0c;但是懷著對小伙伴負責的目的&#xff0c;必須保證代碼的正確性。這是大廚做技術自媒體的態度。前文最后一段代碼是這樣的&#xff1a…

將Java應用程序打包為一個(或胖)JAR

這篇文章的目標是一個有趣但非常強大的概念&#xff1a;將應用程序打包為單個可運行的JAR文件&#xff0c;也稱為一個或胖 JAR文件。 我們習慣了大型WAR歸檔文件&#xff0c;其中包含所有打包在某些公用文件夾結構下的依賴項。 使用類似于JAR的打包&#xff0c;情況有所不同&a…

學習java的第三天,猜字符的小程序

關于猜字符的小程序 主要實現&#xff1a;隨機輸出5個字母&#xff0c;用戶輸入猜測的字母&#xff0c;進行對比得出結果 主要有3個方法&#xff1a;主方法main(); 產生隨機字符的方法generate(); 比較用戶輸入的字符與隨機產生的字符的方法check&#xff08;&#xff09;&…

《Linux命令行與shell腳本編程大全 第3版》創建實用的腳本---10

以下為閱讀《Linux命令行與shell腳本編程大全 第3版》的讀書筆記&#xff0c;為了方便記錄&#xff0c;特地與書的內容保持同步&#xff0c;特意做成一節一次隨筆&#xff0c;特記錄如下&#xff1a;轉載于:https://www.cnblogs.com/guochaoxxl/p/7894995.html