您好,登錄后才能下訂單哦!
這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)Java 注解的使用方法,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
注解說明
Java注解又稱Java標注,是Java語言5.0版本開始支持加入源代碼的特殊語法元數(shù)據(jù)。為我們在代碼中添加信息提供了一種形式化的方法,使我們可以在稍后某個時刻非常方便的使用這些數(shù)據(jù)。Java語言中的類、方法、變量、參數(shù)和包等都可以被標注。和Javadoc不同,Java標注可以通過反射獲取注解內(nèi)容。在編譯器生成類文件時,注解可以被嵌入到字節(jié)碼中。Java虛擬機可以保留注解內(nèi)容,在運行時可以獲取到注解內(nèi)容。
內(nèi)置注解
Java定義了一套注解,共有7個,3個在java.lang中,剩下4個在java.lang.annotation中。
1.作用在代碼的注解是:
2.作用在其他注解的注解(或者說元注解)是:
3.從Java 7開始,額外添加了3個注解:
元注解
元注解就是上面說到的作用在其他注解上的注解。
1.@Retention:表明該注解的生命周期
生命周期類型 | 描述 |
---|---|
RetentionPolicy.SOURCE | 標記的注釋僅保留在源級別中,并由編譯器忽略。 |
RetentionPolicy.CLASS | 標記的注釋在編譯時由編譯器保留,但Java虛擬機(JVM)會忽略。 |
RetentionPolicy.RUNTIME | 標記的注釋由JVM保留,因此運行時環(huán)境可以使用它。 |
2.@Documented:表明該注解標記的元素可以被Javadoc或類似的工具文檔化
3.@Target: 表明該注解可以應用的java元素類型
Target類型 | 描述 |
---|---|
ElementType.TYPE | 可以應用于類的任何元素。 |
ElementType.FIELD | 可以應用于字段或?qū)傩浴?/td> |
ElementType.METHOD | 可以應用于方法級注釋。 |
ElementType.PARAMETER | 可以應用于方法的參數(shù)。 |
ElementType.CONSTRUCTOR | 可以應用于構(gòu)造函數(shù)。 |
ElementType.LOCAL_VARIABLE | 可以應用于局部變量。 |
ElementType.ANNOTATION_TYPE | 可以應用于注釋類型。 |
ElementType.PACKAGE | 可以應用于包聲明。 |
ElementType.TYPE_PARAMETER | 1.8版本新增,應用于類型變量 |
ElementType.TYPE_USE | 1.8版本新增,應用于任何使用類型的語句中(例如聲明語句、泛型和強制轉(zhuǎn)換語句中的類型) |
4.@Inherited:表明使用了@Inherited注解的注解,所標記的類的子類也會擁有這個注解
5.@Repeatable:Java SE 8中引入的,@Repeatable注釋表明標記的注釋可以多次應用于相同的聲明或類型使用(即可以重復在同一個類、方法、屬性等上使用)。
自定義注解
其實說了這么多,都是一些總結(jié)性的知識點,我敢說到現(xiàn)在,大家還是對注解是云里霧里的。想要更好的認識注解,只有我們自己定義一個注解,來實現(xiàn)一個我們的注解,通過實現(xiàn)一個我們自己的注解來熟悉注解的工作流程。
Java中自定義注解和創(chuàng)建一個接口相似,聲明一個注解要用到以下東西:
同時需要注意以下事項:
規(guī)則知道了,下面我來編碼實現(xiàn)一個自定義的注解。比如我們在實現(xiàn)一個自定義的ORM框架的時候,都會通過注解來實現(xiàn)數(shù)據(jù)表名與JAVA類的映射,表字段與JAVA類字段的映射關(guān)系,下面就來簡單實現(xiàn)這個功能。
定義Table注解:
package com.jellythink.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(value={ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Table { String value(); }
定義字段注解:
package com.jellythink.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(value={ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface FieldMapping { String name(); String type(); int length(); }
應用注解:
package com.jellythink; import com.jellythink.annotation.FieldMapping; import com.jellythink.annotation.Table; @Table("tb_student") public class Student { @FieldMapping(name = "id", type = "int", length = 10) private int id; @FieldMapping(name = "name", type = "varchar", length = 6) private String stuName; @FieldMapping(name = "age", type="int", length = 4) private String stuAge; // 省略getter and setter }
讀取注解信息:
package com.jellythink; import com.jellythink.annotation.Table; import com.jellythink.annotation.FieldMapping; import java.lang.reflect.Field; public class Main { public static void main(String[] args) { try { Class clazz = Class.forName("com.jellythink.Student"); // 查詢類上的注解 Table tbStudent = (Table)clazz.getAnnotation(Table.class); System.out.println(tbStudent.value()); // 查詢屬性上的注解 Field stuId = clazz.getDeclaredField("id"); FieldMapping fieldStuId = stuId.getAnnotation(FieldMapping.class); System.out.println(fieldStuId.name() + "--" + fieldStuId.type() + "--" + fieldStuId.length()); Field stuName = clazz.getDeclaredField("stuName"); FieldMapping fieldStuName = stuName.getAnnotation(FieldMapping.class); System.out.println(fieldStuName.name() + "--" + fieldStuName.type() + "--" + fieldStuName.length()); Field stuAge = clazz.getDeclaredField("stuAge"); FieldMapping fieldStuAge = stuName.getAnnotation(FieldMapping.class); System.out.println(fieldStuAge.name() + "--" + fieldStuAge.type() + "--" + fieldStuAge.length()); // 通過上面查詢到的數(shù)據(jù)拼接成SQL語句 String name = "果凍"; String sql = "select * from " + tbStudent.value() + " where " + fieldStuName.name() + " = '" + name + "'"; System.out.println("SQL=" + sql); } catch (Exception e) { // Handle the exception } } }
通過上面的代碼,有木有感受到自定義注解還是非常簡單的;同時有沒有感覺到注解這個功能是非常強大的。
總結(jié)
總的來說,注解這個功能很強大,但是使用起來確是非常簡單的,這就是牛叉東西的特點,好用又讓人不感覺到復雜。以后再遇到注解東西,內(nèi)心就不再犯怵,不再迷茫了。
上述就是小編為大家分享的Java 注解的使用方法了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。