【JAVA基礎】註解

来源:http://www.cnblogs.com/chenpi/archive/2016/03/28/5327151.html
-Advertisement-
Play Games

以下內容參考java編程思想-4,jdk版本為jdk5.0,有點老-_-||| 什麼是註解 JAVA SE5引入,也稱元數據,可以直接添加到代碼中,用來完整描述程式所需的信息,而這些信息是無法用Java來表達的; 內置註解 jdk5.0中內置了三種標準註解和四種元註解; 三種標準註解,定義在java ...


以下內容參考java編程思想-4,jdk版本為jdk5.0,有點老-_-|||

什麼是註解

JAVA SE5引入,也稱元數據,可以直接添加到代碼中,用來完整描述程式所需的信息,而這些信息是無法用Java來表達的;

內置註解

jdk5.0中內置了三種標準註解和四種元註解;

三種標準註解,定義在java.lang中:

@Override  //表示子類方法覆蓋父類方法

@Deprecated //已過時,不建議使用的API

@SuppressWarnings //取消編譯器警告

四種元註解:

@Target  //指定該註解可以用在什麼地方

可選參數:

CONSTRUCTOR:構造器聲明

FIELD:域聲明

LOCAL_VARIABLE:局部變數聲明

METHOD:方法聲明

PACKAGE:包聲明

PARAMETER:參數聲明

TYPE:類、介面聲明

@Retention //表明該註解在哪一級別可用

可選參數:

SOURCE:註解將被編譯器丟棄;

CLASS:註解在class文件中可用,但會被VM丟棄;

RUNTIME:VM在運行期間也保留註解,可以通過反射機制讀取註解信息;

@Documented//表明將此註解包含在Javadoc中

@Inherited //允許子類繼承父類的註解

基本語法

自定義註解

標記註解

定義一個@Test註解,如下代碼所示,可以看到,註解的定義與介面類似,事實上註解與介面一樣,也會被編譯成class文件;

package annotations;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
    
}

在註解中,一般都會包含一些元素以表示某些值,當分析處理註解時,程式可以讀取這些值;

上面的@Test註解不包含元素,被稱為標記註解;

包含元素的註解

下麵代碼定義了一個包含元素的註解,元素的定義類似於方法,定義中包含了元素的數據類型,如下,id為int類型,description為String類型,且包含一個預設值;

package annotations;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
    public int id();

    public String description() default "no description";
}

註意,註解元素可用的類型如下:

所有的基本數據類型(int,double...)

String

Class

enum

Annotation

數組(以上類型為元素)

如果使用其它類型編譯器會報錯,特別提醒,Integer,Double等基本數據類型的包裝類型也是不允許的;

另外,元素是不能有不確定的值,要麼有預設值,要麼提供元素的值,且不能為null;

註解使用

上面定義的@UseCase註解的使用如下所示,很簡單,在方法前面寫上註解,並指定元素的值,如果未指定的話將使用預設值;

package annotations;

import java.util.*;

public class PasswordUtils {
    @UseCase(id = 47, description = "Passwords must contain at least one numeric")
    public boolean validatePassword(String password) {
        return (password.matches("\\w*\\d\\w*"));
    }

    @UseCase(id = 48)
    public String encryptPassword(String password) {
        return new StringBuilder(password).reverse().toString();
    }

    @UseCase(id = 49, description = "New passwords can't equal previously used ones")
    public boolean checkForNewPassword(List<String> prevPasswords, String password) {
        return !prevPasswords.contains(password);
    }
} 

編寫註解處理器

利用JAVA的反射機制,可以查找註解標記,下麵是一個簡單的註解處理器,用於解析上面提到的@UserCase註解,主要使用到了Class類的getDeclaredMethods()方法和Method類的getAnnotation(Class<T> annotationClass)方法;getDeclaredMethods返回類中聲明的所有方法,getAnnotation返回指定的註解;

package annotations;

import java.lang.reflect.*;
import java.util.*;

public class UseCaseTracker {
    public static void trackUseCases(List<Integer> useCases, Class<?> cl) {
        for (Method m : cl.getDeclaredMethods()) {
            UseCase uc = m.getAnnotation(UseCase.class);
            if (uc != null) {
                System.out.println("Found Use Case:" + uc.id() + " "
                        + uc.description());
                useCases.remove(new Integer(uc.id()));
            }
        }
        for (int i : useCases) {
            System.out.println("Warning: Missing use case-" + i);
        }
    }

    public static void main(String[] args) {
        List<Integer> useCases = new ArrayList<Integer>();
        Collections.addAll(useCases, 47, 48, 49, 50);
        trackUseCases(useCases, PasswordUtils.class);
    }
}

註解常見使用場景

描述資料庫表結構與類關係映射(hibernate...)

單元測試(junit...)

一些配置等(spring...)

...

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原址:http://blog.chedushi.com/archives/7258 最近在用 xlrd 寫一個題庫自動導出的程式,但碰到一個比較 ugly 的問題。 程式要求是將 xls 文件中的數據導出成文本,但 xlrd 在讀取數據時,會將 xls 單元格中所有可能是數字的數據都自動轉換成 py ...
  • 代碼: 中間就遇見一個問題很讓我糾結,就是xlrd 在讀取數據時,會將 xls 單元格中所有可能是數字的數據都自動轉換成 python 的 float。這時候,我們通過 str(cell.value) 會得到 12.0 (假設 cell.value = 12.0)。 解決辦法:比如我的a=1,那麼x ...
  • 2015老男孩Python培訓第八期視頻教程,希望您通過本教程的學習,能學會常用方法和技巧。教程從基礎知識開始講解一直到後期的案例實戰,完全零基礎學習,從初學者的角度探討分析問題,循序漸進由易到難,確保每一位初學者都能融會貫通。從零基礎到開發的大神,您只要兩個字——堅持!屌絲逆襲模式已經開啟,各位小 ...
  • 繼上一篇【Python數據分析】Python3操作Excel-以豆瓣圖書Top250為例 對豆瓣圖書Top250進行爬取以後,鑒於還有一些問題沒有解決,所以進行了進一步的交流討論,這期間得到了一隻尼瑪的幫助與啟發,十分感謝! 上次存在的問題如下: 1.寫入不能繼續的問題 2.在Python IDLE ...
  • 小Alan在最近的開發中遇到了敏感詞過濾,便去網上查閱了很多敏感詞過濾的資料,在這裡也和大家分享一下自己的理解。 在寫之前,小Alan給大家推薦一篇來自http://cmsblogs.com/?p=1031的博文,也會參考部分內容來描述博文。 敏感詞過濾應該是不用給大家過多的解釋吧?講白了就是你在項 ...
  • ...
  • 在此之前,向大家說明的是,我們整個框架用的是flask + sqlalchemy + redis。如果沒有開發過web,還是先去學習一下,這邊只是介紹如果從開發web轉換到開發移動端。如果flask還不是很熟悉,我建議先到這個網站簡單學習一下,非常非常簡單。http://dormousehole.r ...
  • gcc name.c -o name; ./name或者gcc name.c -o name && ./name;同時執行關鍵字:void sizeof(運算符,它能告訴你某樣東西在儲存器中占多少位元組。例:sizeof(int)返回4,sizeof("Turtles!")返回9,其中包含8個字元外加 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...