Java注解詳解

概述

注解是對程序代碼進行標注和解釋的一種方式。在Java中,注解提供了一種元數據形式,能夠在程序中嵌入有關程序的信息,以便進行進一步的處理。注解通過使用@符號來聲明,如@Override@Deprecated等。

注解和注釋的區別

  • 注釋:是給程序員看的,不會對程序產生任何影響。
  • 注解:是給編譯器或其他工具看的,可以在編譯、運行時進行一些特殊操作。

使用注解進行配置的優勢

使用注解進行配置能使代碼更簡潔、方便,而不再需要繁瑣的配置文件。注解能夠直觀地標識出程序中的關鍵信息,提高代碼的可讀性和可維護性。

自定義注解

格式

javaCopy codepublic @interface 注解名稱 {public 屬性類型 屬性名() default 默認值;
}

屬性類型

  • 基本數據類型
  • String
  • Class
  • 注解
  • 枚舉
  • 以上類型的一維數組

示例代碼

javaCopy codepublic @interface Anno2 {
}public enum Season {SPRING, SUMMER, AUTUMN, WINTER;
}public @interface Anno1 {// 定義一個基本類型的屬性int a() default 23;// 定義一個String類型的屬性String name() default "shizhanban";// 定義一個Class類型的屬性Class clazz() default Anno2.class;// 定義一個注解類型的屬性Anno2 anno() default @Anno2;// 定義一個枚舉類型的屬性Season season() default Season.SPRING;// 以上類型的一維數組// int數組int[] arr() default {1, 2, 3, 4, 5};// 枚舉數組Season[] seasons() default {Season.SPRING, Season.SUMMER};// value。后期我們在使用注解的時候,如果我們只需要給注解的value屬性賦值。// 那么value就可以省略String value();
}// 在使用注解的時候如果注解里面的屬性沒有指定默認值。
// 那么我們就需要手動給出注解屬性的設置值。
//@Anno1(name = "shizhanban")
@Anno1("abc")
public class AnnoDemo {
}

注意

如果只有一個屬性需要賦值,并且屬性的名稱是value,則value可以省略,直接定義值即可。

自定義注解案例

需求

自定義一個注解@Test,用于指定類的方法上,如果某一個類的方法上使用了該注解,就執行該方法。

實現步驟

  1. 自定義一個注解Test,并在類的某幾個方法上加上注解。
  2. 在測試類中,獲取注解所在類的Class對象。
  3. 獲取類中所有的方法對象。
  4. 遍歷每一個方法對象,判斷是否有對應的注解。
javaCopy code// 表示Test這個注解的存活時間
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Test {
}public class UseTest {// 沒有使用Test注解public void show() {System.out.println("UseTest....show....");}// 使用Test注解@Testpublic void method() {System.out.println("UseTest....method....");}// 沒有使用Test注解@Testpublic void function() {System.out.println("UseTest....function....");}
}public class AnnoDemo {public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {// 1.通過反射獲取UseTest類的字節碼文件對象Class clazz = Class.forName("com.shizhanban.UseTest");// 創建對象UseTest useTest = (UseTest) clazz.newInstance();// 2.通過反射獲取這個類里面所有的方法對象Method[] methods = clazz.getDeclaredMethods();// 3.遍歷數組,得到每一個方法對象for (Method method : methods) {// method依次表示每一個方法對象。// isAnnotationPresent(Class<? extends Annotation> annotationClass)// 判斷當前方法上是否有指定的注解。// 參數:注解的字節碼文件對象// 返回值:布爾結果。  true 存在  false 不存在if (method.isAnnotationPresent(Test.class)) {method.invoke(useTest);}}}
}

元注解

概述

元注解是描述注解的注解。

元注解介紹

  • @Target:指定了注解能在哪里使用。
  • @Retention:可以理解為保留時間(生命周期)。
  • @Inherited:表示修飾的自定義注解可以被子類繼承。
  • @Documented:表示該自定義注解會出現在API文檔里面。

示例代碼

javaCopy code@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD}) // 指定注解使用的位置(成員變量,類,方法)
@Retention(RetentionPolicy.RUNTIME) // 指定該注解的存活時間
// @Inherited // 指定該注解可以被繼承
public @interface Anno {
}@Anno
public class Person {
}public class Student extends Person {public void show() {System.out.println("student.......show..........");}
}public class StudentDemo {public static void main(String[] args) throws ClassNotFoundException {// 獲取到Student類的字節碼文件對象Class clazz = Class.forName("com.shizhanban.Student");// 獲取注解。boolean result = clazz.isAnnotationPresent(Anno.class);System.out.println(result);}
}

通過元注解,我們可以更加靈活地定義和使用自定義注解,控制注解的生命周期和作用范圍。

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

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

相關文章

Unity中Batching優化的GPU實例化(4)

文章目錄 前言一、構建需要實例化的額外數據二、在頂點著色器&#xff0c;將實例化 ID 從 appdata 存入 v2f 傳給片元著色器三、在片斷著色器中訪問具體的實例化變量三、使用代碼修改Shader材質屬性&#xff0c;實現GPU實例化后不同對象顏色不同的效果1、在C#測試腳本生成小板凳…

ReactJs筆記摘錄

前言 以前2018年搞過一段時間react antd開發&#xff0c;兜兜轉轉又回到react世界。 TODO中 Hook函數 JSX語法 根元素與斜杠 注意局部的jsx片段也要加根元素: return (<div>{items.map((item) > (// 此處只能有一個根元素!!!<>...<div className&quo…

要求CHATGPT高質量回答的藝術:提示工程技術的完整指南—第 23 章:命名實體識別提示

要求CHATGPT高質量回答的藝術&#xff1a;提示工程技術的完整指南—第 23 章&#xff1a;命名實體識別提示 命名實體識別&#xff08;NER&#xff09;是一種允許模型對文本中的命名實體&#xff08;如人物、組織、地點和日期&#xff09;進行識別和分類的技術。 要在 ChatGPT…

微前端介紹

目錄 微前端概念 微前端特性 場景演示 微前端方案 iframe 方案 qiankun 方案 micro-app 方案 EMP 方案 無界微前端 方案 無界方案 成本低 速度快 原生隔離 功能強大 總結 前言&#xff1a;微前端已經是一個非常成熟的領域了&#xff0c;但開發者不管采用哪個現…

Leetcode—290.單詞規律【簡單】

2023每日刷題&#xff08;五十一&#xff09; Leetcode—290.單詞規律 實現代碼 class Solution { public:bool wordPattern(string pattern, string s) {unordered_map<char, string> m1;unordered_map<string, char> m2;stringstream stro(s);string tmp;for(a…

(env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序

應公司需求&#xff0c;在特定情況下需要修改ip 在開發過程中出現的小插曲 1、第一種情況&#xff1a;重復聲明 2、第二種情況&#xff1a; 應官方要求&#xff0c;需要跳轉的 tabBar 頁面的路徑&#xff08;需在 pages.json 的 tabBar 字段定義的頁面&#xff09;&#xff0…

React中使用TypeScript代替prop-types

原文鏈接 公眾號-React中使用TypeScript代替prop-types 個人公眾號&#xff0c;嗚嗚嗚&#xff0c;求各位大佬們關注下&#xff0c;本人的公眾號主要寫React 跟NodeJs的 ?關于prop-types 對于部分的同學&#xff0c;不大了解為什么我們的代碼里面要用到prop-types這個庫&a…

ArkTS快速入門

一、概述 ArkTS是鴻蒙生態的應用開發語言。它在保持TypeScript&#xff08;簡稱TS&#xff09;基本語法風格的基礎上&#xff0c;對TS的動態類型特性施加更嚴格的約束&#xff0c;引入靜態類型。同時&#xff0c;提供了聲明式UI、狀態管理等相應的能力&#xff0c;讓開發者可以…

深度學習基礎回顧

深度學習基礎 淺層網絡 VS 深層網絡深度學習常用的激活函數Sigmoid 函數ReLU 函數Softplus 函數tanh函數 歸納偏置CNN適用數據歸納偏置 RNN適用數據歸納偏置 淺層網絡 VS 深層網絡 淺層神經網絡參數過多&#xff0c;導致模型的復雜度和計算量很高&#xff0c;難以訓練。而深層…

Redisson的基礎使用(2)

布隆過濾器&#xff08;Bloom Filter&#xff09; 布隆過濾器一般用于解決緩存穿透的問題。主要原理是使用一組哈希函數&#xff0c;將元素映射成一組位數組中的索引位置。如果要檢查某個元素是否在集合中時&#xff0c;將此元素通過所有的哈希函數&#xff0c;查看哈希值對應的…

硬件開發筆記(十五):RK3568底板電路VGA顯示接口原理圖分析

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134849296 紅胖子網絡科技博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬…

多態和繼承復習

與其明天開始&#xff0c;不如現在行動&#xff01; 文章目錄 多態多態成立的條件細節 繼承&#x1f48e;總結 多態 多態成立的條件 存在繼承關系或者實現關系子類重寫父類的方法父類引用指向子類對象 細節 通過父類的引用調用子類的對象 Animal animal new Dog();animal…

C語言搭建項目-學生管理系統(非鏈表)

、 目錄 搭建offer.h文件 搭建offer.c中的main函數 密碼登入系統 搭建my_oferr.c中的接口函數 使用幫助菜單接口函數 增加學生信息接口函數 查詢學生信息接口函數 刪除學生信息接口函數 保存學生信息接口 打開文件fopen 關閉文件fclose 判斷是否保存文件fwrite 退出執行文件…

C++:const類型數據的修改問題

在C語言中const類型的數據嚴格意義上可以修改&#xff1a; const int a1; int*b&a; *b2;不同于C語言&#xff0c;C中指針類型是要嚴格對應的&#xff0c;對const類型的數據必須使用const類型的指針進行接收&#xff0c;從而避免修改&#xff1b; 但問題是c中同樣支持指針的…

年度工作總結怎么寫?掌握這些年終總結萬能公式,讓你的報告出彩無比!

光陰似箭&#xff0c;日月如梭&#xff0c;時間總是不疾不徐地向前奔去&#xff0c;轉眼就來到了2023年的最后一個月&#xff0c;12月一到&#xff0c;上班族和打工人又要開始忙活工作總結的事情~ 工作總結&#xff0c;不僅是一年工作的回顧&#xff0c;更是未來規劃的起點。你…

Springboot中的RestTemplate

Springboot中的RestTemplate 在Spring Boot應用程序中&#xff0c;RestTemplate是一個用于進行HTTP請求的強大工具。通常用于與RESTful API進行交互、調用其他服務或執行HTTP請求。它提供了各種方法來發送HTTP請求&#xff08;如GET、POST、PUT、DELETE等&#xff09;&#xf…

cuda lib 線程安全的要義

1, 概述 cuda lib 線程安全的幾個多線程的情景&#xff1a; 單卡多線程&#xff1b; 多卡多線程-每卡單線程&#xff1b; 多卡多線程-每卡多線程&#xff1b; 需要考慮的問題&#xff1a; 每個 cublasHandle_t 只能有一個stream么&#xff1f; 每個cusolverHandle_t 只能有一…

python3.5安裝教程及環境配置,python3.7.2安裝與配置

大家好&#xff0c;小編來為大家解答以下問題&#xff0c;python3.5安裝教程及環境配置&#xff0c;python3.7.2安裝與配置&#xff0c;現在讓我們一起來看看吧&#xff01; python 從爬蟲開始&#xff08;一&#xff09; Python 簡介 首先簡介一下Python和爬蟲的關系與概念&am…

Android Studio的代碼筆記--IntentService學習

IntentService學習 IntentService常規用法清單注冊服務服務內容開啟服務 IntentService 一個 HandlerThread工作線程&#xff0c;通過Handler實現把消息加入消息隊列中等待執行&#xff0c;通過傳遞的intent在onHandleIntent中處理任務。&#xff08;多次調用會按順序執行事件…

Spring Cloud Alibaba實踐 --Sentinel

sentinel簡介 Sentinel的官方標題是&#xff1a;分布式系統的流量防衛兵。從名字上來看&#xff0c;很容易就能猜到它是用來作服務穩定性保障的。對于服務穩定性保障組件&#xff0c;如果熟悉Spring Cloud的用戶&#xff0c;第一反應應該就是Hystrix。但是比較可惜的是Netflix…