Java 菜鸟入门 | 深入浅出 Java 注解
注解簡介
所謂注解,其實就像一種擁有特定作用的注釋,自 JDK1.5 及之后版本所引入的特性,它是放在 Java 源碼的類、方法、字段、參數前的一種用作標注的“元數據”,與類、接口、枚舉處于同一個層次中。
通過其作用的不同,我們常常將注解分為如下 3 類:
常用的預定義注解
@Override
一般是用在方法上,表示重寫該父類的方法,比如我們使用最多的 toString() 方法,它是 Object 類的一個方法,而我們的寫的類都是繼承自 Object 類,所以我們自定義的所有類都是有 toString() 方法的。但是如果我們自定義類中的方法在父類中沒有,則不能使用該注解,否則會導致無法編譯通過。
package com.cunyu;/*** Created with IntelliJ IDEA.** @author : cunyu* @version : 1.0* @email : 747731461@qq.com* @website : https://cunyu1943.github.io* @date : 2021/6/20 10:04* @project : JavaWeb* @package : com.cunyu* @className : OverrideTest* @description :*/public class OverrideTest {private Integer id;private String name;public OverrideTest(Integer id, String name) {this.id = id;this.name = name;}@Overridepublic String toString() {final StringBuffer sb = new StringBuffer("OverrideTest{");sb.append("id=").append(id);sb.append(", name='").append(name).append('\'');sb.append('}');return sb.toString();}public static void main(String[] args) {Integer id = 101;String name = "村雨遙";OverrideTest overrideTest = new OverrideTest(id, name);System.out.println(overrideTest);} }@Deprecated
一般用在方法之前,表示該方法已經過期,不建議再繼續使用(但是仍然有效,只不過可能有更新的版本,推薦使用更新的版本)。
package com.cunyu;/*** Created with IntelliJ IDEA.** @author : cunyu* @version : 1.0* @email : 747731461@qq.com* @website : https://cunyu1943.github.io* @公眾號 : 村雨遙* @date : 2021/6/20 10:07* @project : JavaWeb* @package : com.cunyu* @className : DeprecateTest* @description :*/public class DeprecateTest {@Deprecatedpublic static void sayHello() {System.out.println("Hello World!");}public static void newSayHello() {System.out.println("Hello,Welcome to Java !");}public static void main(String[] args) {sayHello();newSayHello();} }@SuppressWarnings
表示忽略警告信息,常用的值以及含義如下表:
| deprecation | 使用了不贊成使用的類或方法時的警告 |
| unchecked | 使用了未經檢查的轉換時的警告 |
| fallthrough | 當 switch 程序塊直接通往下一種情況而沒有 break 時的警告 |
| path | 在類路徑、源文件路徑等中有不存在的路徑時的警告 |
| serial | 當在可序列化的類上缺少 serialVersionUID 定義時的警告 |
| finally | 任何 finally 子句不能正常完成時的警告 |
| rawtypes | 泛型類型未指明 |
| unused | 引用定義了,但是沒有被使用 |
| all | 關閉以上所有情況的警告 |
自定義注解
格式
我們可以使用 @interface 來自定義注解,其格式如下:
public @interface AnnotationName{// 屬性列表…… }一個簡單的示例如下,其中 AnnoDemo 代表著我們自定義注解的名稱,而 name()、age()、score() 則分別表示自定義注解的三個屬性,而且我們利用關鍵字 default 對每個屬性都賦予了默認值。
public @interface AnnoDemo{String name() default "村雨遙";int age() default 20;float score() default 60.0f; }原理
注解本質上相當于一個接口,它默認繼承自 java.lang.annotation.Annotation。
public interface AnnotationName extends java.lang.annotation.Annotation{}參數
注解的參數類似于無參的方法,通常我們推薦用 default 來設定一個默認值,對于方法的基本要求通常有如下幾點:
如上述例子中,name()、age()、score() 就是我們自定義注解的參數。而當我們要是用該注解時,則通過如下方式來對參數進行賦值。
@AnnoDemo(name = "村雨遙", age = 26, score = 95.0f) public class Demo{…… }元注解
定義
所謂元注解(meta annotation),就是可以用來修飾其他注解的注解。
常用的元注解
描述注解所修飾的對象范圍,其取值主要有如下幾種:
| ElementType.TYPE | 表示可以作用于類或接口 |
| ElementType.FIELD | 表示可以作用于成員變量 |
| ElementType.METHOD | 表示可以作用于方法 |
| ElementType.CONSTRUCTOR | 表示可以作用于構造方法 |
| ElementType.PARAMETER | 表示可以作用于方法的參數 |
用于約束注解的生命周期,其取值如下:
| RetentionPolicy.SOURCE | 表示在源代碼文件中有效,注解將被編譯器丟棄(注解信息僅保留在源碼中,源碼經編譯后注解信息丟失,不再保留到字節碼文件中) |
| RetentionPolicy.CLASS | 表示在字節碼文件中有效,注解在字節碼文件中可用,但會被 JVM 丟棄 |
| RetentionPolicy.RUNTIME | 表示在運行時有效,此時可以通過反射機制來讀取注解的信息 |
描述其他類型的注解是否被抽取到 API 文檔中。
@Target(ElementType.TYPE) @Retention(RetentionPoicy.RUNTIME) @Documented public @interface AnnoDemo{String name() default "村雨遙";int age() default 20;float score() default 60.0f; }這是一個標記注解,描述某個注解能夠被子類繼承,但是該元注解只適合已經配置了 @Target(ElementType.TYPE) 類型的自定義注解,而且僅針對于類的繼承,而對于接口的繼承則無效。
@Inherited public @interface AnnoDemo{String name() default "村雨遙";int age() default 20;float score() default 60.0f; }該注解是從 JDK1.8 新引入的元注解,表示在同一位置能夠重復相同的注解。在沒有該注解之前,我們一般是無法在同一類型上使用相同注解的,但引入該注解后,我們就可以在同一類型上使用相同注解。
@Target(ElementType.TYPE) @Repeatable(AnnoDemos.class) public @interface AnnoDemo{String name() default "村雨遙";int age() default 20;float score() default 60.0f; }public @interface AnnoDemos{AnnoDemo[] value(); }利用 @Repeatable 配置自定義注解之后,我們就可以在某個類型聲明處添加多個我們自定義的注解了。
@AnnoDemo(name = "村雨遙", age = 26, score = 88.0f) @AnnoDemo(name = "曉瑜", age = 27, score = 90.0f) public class Student{…… }總結
總結上述的知識點,我們將自定義注解的過程歸納為如下 3 步。
在實際應用過程中,利用元注解配置自定義注解時,必須設置 @Target 和 @Retention 兩個元注解,而且 @Retention 的值通常是設置為 RetentionPolicy.RUNTIME。
好了,以上就是我們注解的相關概念以及自定義注解所需要的掌握的一些知識點了,如果你覺得對你有所幫助,那就來一波點贊關注吧!
總結
以上是生活随笔為你收集整理的Java 菜鸟入门 | 深入浅出 Java 注解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html按钮超链接到微信,技巧|教你给微
- 下一篇: 那些年,我们一起做过的 Java 课后练