Java_注解

1. 簡介

在Java中,注解(Annotation)是一種元數據形式,它為代碼添加了額外的信息,這些信息可以被編譯器、工具、框架或運行時環境使用。注解提供了一種聲明性的方式來向程序中添加元數據,而不需要修改程序的實際邏輯。


2. Java中常見的注解

2.1 內建注解(Built-in Annotations)

  • @Override: 用于標識一個方法覆蓋了父類中的方法。
  • @Deprecated: 用于標識已過時的方法或類,表示不再推薦使用。
  • @SuppressWarnings: 抑制編譯器產生警告信息。

2.2 元注解(Meta-Annotations)

  • @Target: 指定注解的應用范圍,可以是類、方法、字段等。
    該注解的ElementType枚舉值:

    ElementType.ANNOTATION_TYPE//表示該注解可以應用在其他注解上。ElementType.CONSTRUCTOR//表示該注解可以應用在構造方法上。ElementType.FIELD//表示該注解可以應用在字段(屬性)上。ElementType.LOCAL_VARIABLE//表示該注解可以應用在局部變量上。ElementType.METHOD//表示該注解可以應用在方法上。ElementType.PACKAGE//表示該注解可以應用在包上。ElementType.PARAMETER//表示該注解可以應用在參數上。ElementType.TYPE//表示該注解可以應用在類、接口(包括注解類型)、枚舉上。
    
  • @Retention: 指定注解的保留策略,可以是源代碼、編譯時期或運行時期。

    • RetentionPolicy.SOURCE
      表示注解僅存在于源代碼中,在編譯時會被丟棄,不會保留在編譯生成的字節碼文件中。這意味著這種類型的注解在運行時是不可見的。

    • RetentionPolicy.CLASS
      表示注解存在于編譯生成的字節碼文件中,但在運行時不可見。這是默認的保留策略,如果在 @Retention 中不顯式指定,默認是 RetentionPolicy.CLASS。

    • RetentionPolicy.RUNTIME
      表示注解在運行時是可見的,可以通過反射等機制獲取注解信息。這種保留策略允許在運行時通過反射來處理注解。

  • @Documented: 表示注解將包含在JavaDoc中。

  • @Inherited: 表示注解可以被子類繼承

2.3 自定義注解

定義示例:

// 定義一個自定義注解
public @interface MyAnnotation {String value() default ""; // 注解元素,默認值為空字符串int count() default 0; //定義了一個名稱為 count, 類型為int, 默認值為0的 注解元素
}

使用示例:

@MyAnnotation(value = "Hello", count = 5)
public class MyClass {// 類的內容
}

3. 獲取注解信息

僅在 @Retention(RetentionPolicy.RUNTIME) 時使用

3.1 獲取類注解信息

import java.lang.annotation.*;// 定義自定義注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation {String value() default "";int count() default 0;
}// 使用自定義注解
@MyAnnotation(value = "Hello", count = 5)
public class MyClass {public static void main(String[] args) {// 獲取類上的注解MyAnnotation annotation = MyClass.class.getAnnotation(MyAnnotation.class);// 判斷注解是否存在if (annotation != null) {// 訪問注解中的元素值String value = annotation.value();int count = annotation.count();// 打印注解中的信息System.out.println("Value: " + value);System.out.println("Count: " + count);} else {System.out.println("MyAnnotation is not present on MyClass.");}}
}

3.2 獲取方法的注釋信息

定義注解

import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyMethodAnnotation {String value() default "";int count() default 0;
}

使用注解

public class MyClass {@MyMethodAnnotation(value = "Hello Method", count = 10)public void myMethod() {// 方法的內容}
}

獲取注解信息

import java.lang.reflect.Method;public class AnnotationExample {public static void main(String[] args) {// 獲取類的Class對象Class<MyClass> myClassClass = MyClass.class;try {// 獲取方法的Method對象Method method = myClassClass.getMethod("myMethod");// 獲取方法上的注解MyMethodAnnotation methodAnnotation = method.getAnnotation(MyMethodAnnotation.class);// 判斷注解是否存在if (methodAnnotation != null) {// 訪問注解中的元素值String value = methodAnnotation.value();int count = methodAnnotation.count();// 打印注解中的信息System.out.println("Value: " + value);System.out.println("Count: " + count);} else {System.out.println("MyMethodAnnotation is not present on myMethod.");}} catch (NoSuchMethodException e) {e.printStackTrace();}}
}

3.3 獲取屬性的注解信息

定義注解

import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyFieldAnnotation {String value() default "";int count() default 0;
}

使用注解

public class MyClass {@MyFieldAnnotation(value = "Hello Field", count = 20)private String myField;// 其他類內容...
}

獲取注解信息

import java.lang.reflect.Field;public class AnnotationExample {public static void main(String[] args) {// 獲取類的Class對象Class<MyClass> myClassClass = MyClass.class;try {// 獲取字段的Field對象Field field = myClassClass.getDeclaredField("myField");// 獲取字段上的注解MyFieldAnnotation fieldAnnotation = field.getAnnotation(MyFieldAnnotation.class);// 判斷注解是否存在if (fieldAnnotation != null) {// 訪問注解中的元素值String value = fieldAnnotation.value();int count = fieldAnnotation.count();// 打印注解中的信息System.out.println("Value: " + value);System.out.println("Count: " + count);} else {System.out.println("MyFieldAnnotation is not present on myField.");}} catch (NoSuchFieldException e) {e.printStackTrace();}}
}

getDeclaredField 方法的參數是字段的名稱。如果字段是私有的,還需要通過field.setAccessible(true) 開啟對私有字段的訪問權限

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

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

相關文章

Harmony Ble藍牙App(二)連接與發現服務

Ble藍牙App&#xff08;二&#xff09;連接與發現服務 前言正文一、BlePeripheral回調二、連接和斷連三、連接狀態回調四、發現服務五、服務提供者六、顯示服務七、源碼 前言 在上一篇中我們進行掃描設備的處理&#xff0c;本文中進行連接和發現服務的數據處理&#xff0c;運行…

Mysql數據庫 18.Mysql SQL優化

SQL優化 一、插入優化 多條插入語句&#xff0c;影響執行效率 優化方案 1、批量插入&#xff1a; 在一條insert語句中多條數據&#xff0c;但是如果數據量過大&#xff0c;也不能完全使用一條語句語句&#xff0c;建議數據量為一次性插入1000條以下的數據 如果數據量多大&…

plantUML學習與實戰

背景 在日常工作或者生活中&#xff0c;使用交互圖來描述想法&#xff0c;往往相對于文字來說&#xff0c;可讀性更高&#xff0c;同時一定程度上可以提高溝通效率&#xff0c;但是苦于&#xff0c;不想對一堆控件拖拖拉拉&#xff0c;本人就是一個很討厭畫圖&#xff0c;但是…

【華為OD題庫-036】跳格子2-java

題目 小明和朋友玩跳格子游戲&#xff0c;有n個連續格子組成的圓圈&#xff0c;每個格子有不同的分數&#xff0c;小朋友可以選擇從任意格子起跳&#xff0c;但是不能跳連續的格子&#xff0c;不能回頭跳&#xff0c;也不能超過一圈:給定一個代表每個格子得分的非負整數數組&am…

Python---把函數的返回值作為另外一個函數的參數

def test1():return 50def test2(num):print(num)# 1. 保存函數test1的返回值 result test1()# 2.將函數返回值所在變量作為參數傳遞到test2函數 test2(result) # 50

數據結構 棧和隊列的應用

在昨天分享了有關棧和隊列的基礎知識和基本操作后&#xff0c;今天來分享一些有關棧和隊列的應用 棧和隊列的應用 刪除字符串中的所有相鄰重復項 #include <iostream> #include <stack> using namespace std; string remove(string S) {stack<char> charS…

MySql表中添加emoji表情

共五處需要修改。 語句執行修改&#xff1a; ALTER TABLE xxxxx CONVERT TO CHARACTER SET utf8mb4;

微型計算機原理MOOC題

一、8254 1.掉坑了&#xff0c;AL傳到端口不意味著一定傳到的是低位&#xff0c;要看控制字D5和D4&#xff0c;10是只寫高位&#xff0c;所以是0A00.。。 2. 3. 4.待解決&#xff1a;

優化C++資源利用:探索高效內存管理技巧

W...Y的主頁 &#x1f60a; 代碼倉庫分享&#x1f495; &#x1f354;前言&#xff1a; 我們之前在C語言中學習過動態內存開辟&#xff0c;使用malloc、calloc與realloc進行開辟&#xff0c;使用free進行堆上內存的釋放。進入C后對于動態內存開辟我們又有了新的內容new與dele…

CCC聯盟——UWB MAC(一)

本文在前面已經介紹了相關UWB的PHY之后&#xff0c;重點介紹數字鑰匙&#xff08;Digital Key&#xff09;中關于MAC層的相關實現規范。由于MAC層相應涉及內容比較多&#xff0c;本文首先從介紹UWB MAC的整體框架&#xff0c;后續陸續介紹相關的網絡、協議等內容。 1、UWB MAC架…

真心的表揚與鼓勵,勝過一萬句說教

今天我想和大家分享一下&#xff0c;怎樣跟孩子運用鼓勵和表揚。我記得魯道夫德雷克斯是阿德勒學派的心理學家&#xff0c;也是來自《孩子的挑戰》一書的作者&#xff0c;他說孩子們需要鼓勵&#xff0c;就像植物需要水&#xff0c;鼓勵能讓孩子知道自己做的事與自己是什么樣的…

非自定義Bean注解開發Bean配置類的注解開發

目錄 非自定義Bean注解開發 Bean配置類的注解開發 非自定義Bean注解開發 非自定義的Bean不能像自定義Bean使用Component進行管理&#xff0c;非自定義Bean要通過工廠的方式進行實例化&#xff0c;使用Bean標注方法即可&#xff0c;Bean的屬性文beanName 如果Bean工廠方法需要參…

[23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution

paper | proj | code 提出一種基于K-Planes的4D point cloud Representation&#xff1b;提出一種Hybrid appearance model&#xff0c;包含image blending model和SH model。其中&#xff0c;image blending model將3D點映射回原圖中求得&#xff0c;SH model通過模型預測求得…

【工具欄】熱部署不生效

目錄 配置熱部署&#xff1a; 解決熱部署不生效&#xff1a; 首先檢查&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 配置熱部署&#xff1a; https://blog.csdn.net/m0_67930426/article/details/133690559 解決熱部署不…

Python中的解析器argparse

import argparse## 構造解析器 argparse.ArgumentParser() parse argparse.ArgumentParser(description"caculateing the area of rectangle")## 添加參數 .add_argument() parse.add_argument("--length",typeint,default20,helpThe length of rectangle…

【追求卓越09】算法--散列表(哈希表)

引導 通過前面幾個章節的學習&#xff08;二分查找&#xff0c;跳表&#xff09;&#xff0c;我們發現想要快速查找某一個元素&#xff0c;首先需要將所有元素進行排序&#xff0c;再利用二分法思想進行查找&#xff0c;復雜度是O(logn)。有沒有更快的查找方式呢&#xff1f; 本…

微軟發布最新.NET 8長期支持版本,云計算、AI應用支持再強化

11 月 15 日開始的為期三天的 .NET Conf 在線活動的開幕日上&#xff0c;.NET 8作為微軟的開源跨平臺開發平臺正式發布。.NET 團隊著重強調云、性能、全棧 Blazor、AI 和 .NET MAUI 是.NET 8的主要亮點。.NET團隊在 .NET Conf 2023 [1]活動開幕式上表示&#xff1a;“通過這個版…

nginx 模塊相關配置及結構理解

文章目錄 模塊配置結構模塊配置指令先看一下 ngx_command_t 結構一個模塊配置的demo簡單模塊配置的案例演示 模塊上下文結構模塊的定義 模塊配置結構 Nginx中每個模塊都會提供一些指令&#xff0c;以便于用戶通過配置去控制該模塊的行為。 Nginx的配置信息分成了幾個作用域(sc…

使用注解的AOP編程

使用注解的AOP編程 當注解沒有參數時 當使用注解進行面向切面編程&#xff08;AOP&#xff09;時&#xff0c;你可以按照以下步驟來實現&#xff1a; 步驟&#xff1a; 1. 創建自定義注解&#xff1a; 首先&#xff0c;創建自定義的注解&#xff0c;以便在代碼中標記需要進…

Excel換不了行怎么解決?

方法一: 使用Alt Enter鍵 在Excel中&#xff0c;輸入文字時按下回車鍵&#xff0c;光標將會移到下一個單元格&#xff0c;如果想要換行&#xff0c;可以嘗試使用Alt Enter鍵。具體操作如下: 1.在單元格中輸入文字; 2.想要換行時&#xff0c;在需要換行的位置按下Alt Enter鍵; 3…