国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術(shù)文章
文章詳情頁

Java 注解學(xué)習(xí)筆記

瀏覽:5日期:2022-08-22 08:44:05

注解說明

Java注解又稱Java標(biāo)注,是Java語言5.0版本開始支持加入源代碼的特殊語法元數(shù)據(jù)。為我們在代碼中添加信息提供了一種形式化的方法,使我們可以在稍后某個時刻非常方便的使用這些數(shù)據(jù)。Java語言中的類、方法、變量、參數(shù)和包等都可以被標(biāo)注。和Javadoc不同,Java標(biāo)注可以通過反射獲取注解內(nèi)容。在編譯器生成類文件時,注解可以被嵌入到字節(jié)碼中。Java虛擬機(jī)可以保留注解內(nèi)容,在運行時可以獲取到注解內(nèi)容。

內(nèi)置注解

Java定義了一套注解,共有7個,3個在java.lang中,剩下4個在java.lang.annotation中。

1.作用在代碼的注解是:

@Override - 檢查該方法是否是重寫方法。如果發(fā)現(xiàn)其父類,或者是引用的接口中并沒有該方法時,會報編譯錯誤。 @Deprecated - 標(biāo)記過時方法。如果使用該方法,會報編譯警告。 @SuppressWarnings - 指示編譯器去忽略注解中聲明的警告。

2.作用在其他注解的注解(或者說元注解)是:

@Retention - 標(biāo)識這個注解怎么保存,是只在代碼中,還是編入class文件中,或者是在運行時可以通過反射訪問。 @Documented - 標(biāo)記這些注解是否包含在用戶文檔中。 @Target - 標(biāo)記這個注解應(yīng)該是哪種Java成員。 @Inherited - 標(biāo)記這個注解是繼承于哪個注解類(默認(rèn)注解并沒有繼承于任何子類)

3.從Java 7開始,額外添加了3個注解:

@SafeVarargs - Java 7開始支持,忽略任何使用參數(shù)為泛型變量的方法或構(gòu)造函數(shù)調(diào)用產(chǎn)生的警告。 @FunctionalInterface - Java 8開始支持,標(biāo)識一個匿名函數(shù)或函數(shù)式接口。 @Repeatable - Java 8開始支持,標(biāo)識某注解可以在同一個聲明上使用多次。

元注解

元注解就是上面說到的作用在其他注解上的注解。

1.@Retention:表明該注解的生命周期

生命周期類型 描述 RetentionPolicy.SOURCE 標(biāo)記的注釋僅保留在源級別中,并由編譯器忽略。 RetentionPolicy.CLASS 標(biāo)記的注釋在編譯時由編譯器保留,但Java虛擬機(jī)(JVM)會忽略。 RetentionPolicy.RUNTIME 標(biāo)記的注釋由JVM保留,因此運行時環(huán)境可以使用它。

2.@Documented:表明該注解標(biāo)記的元素可以被Javadoc或類似的工具文檔化

3.@Target: 表明該注解可以應(yīng)用的java元素類型

Target類型 描述 ElementType.TYPE 可以應(yīng)用于類的任何元素。 ElementType.FIELD 可以應(yīng)用于字段或?qū)傩浴? ElementType.METHOD 可以應(yīng)用于方法級注釋。 ElementType.PARAMETER 可以應(yīng)用于方法的參數(shù)。 ElementType.CONSTRUCTOR 可以應(yīng)用于構(gòu)造函數(shù)。 ElementType.LOCAL_VARIABLE 可以應(yīng)用于局部變量。 ElementType.ANNOTATION_TYPE 可以應(yīng)用于注釋類型。 ElementType.PACKAGE 可以應(yīng)用于包聲明。 ElementType.TYPE_PARAMETER 1.8版本新增,應(yīng)用于類型變量 ElementType.TYPE_USE 1.8版本新增,應(yīng)用于任何使用類型的語句中(例如聲明語句、泛型和強(qiáng)制轉(zhuǎn)換語句中的類型)

4.@Inherited:表明使用了@Inherited注解的注解,所標(biāo)記的類的子類也會擁有這個注解

5.@Repeatable:Java SE 8中引入的,@Repeatable注釋表明標(biāo)記的注釋可以多次應(yīng)用于相同的聲明或類型使用(即可以重復(fù)在同一個類、方法、屬性等上使用)。

自定義注解

其實說了這么多,都是一些總結(jié)性的知識點,我敢說到現(xiàn)在,大家還是對注解是云里霧里的。想要更好的認(rèn)識注解,只有我們自己定義一個注解,來實現(xiàn)一個我們的注解,通過實現(xiàn)一個我們自己的注解來熟悉注解的工作流程。

Java中自定義注解和創(chuàng)建一個接口相似,聲明一個注解要用到以下東西:

修飾符:訪問修飾符必須為public,不寫默認(rèn)為pubic; 關(guān)鍵字:關(guān)鍵字為@interface; 注解名稱:注解名稱為自定義注解的名稱,使用時還會用到; 注解類型元素:注解類型元素是注解中內(nèi)容,可以理解成自定義接口的實現(xiàn)部分。

同時需要注意以下事項:

注解方法不能有參數(shù); 注解方法的返回類型局限于原始類型,字符串,枚舉,注解,或以上類型構(gòu)成的數(shù)組; 注解方法可以包含默認(rèn)值; 注解可以包含與其綁定的元注解,元注解為注解提供信息。

規(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();}

應(yīng)用注解:

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 } }}

通過上面的代碼,有木有感受到自定義注解還是非常簡單的;同時有沒有感覺到注解這個功能是非常強(qiáng)大的。

總結(jié)

總的來說,注解這個功能很強(qiáng)大,但是使用起來確是非常簡單的,這就是牛叉東西的特點,好用又讓人不感覺到復(fù)雜。以后再遇到注解東西,內(nèi)心就不再犯怵,不再迷茫了。

以上就是Java 注解學(xué)習(xí)筆記的詳細(xì)內(nèi)容,更多關(guān)于Java 注解的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 容城县| 平阳县| 湘西| 贵港市| 黄冈市| 泰顺县| 海阳市| 灵寿县| 武川县| 江阴市| 平泉县| 开封市| 原平市| 永川市| 普安县| 都昌县| 鄂托克前旗| 襄汾县| 根河市| 莱阳市| 黔西县| 伊宁县| 天水市| 沙田区| 汝城县| 无为县| 开化县| 三江| 绵竹市| 安徽省| 台山市| 田阳县| 全南县| 临桂县| 介休市| 泽州县| 鄄城县| 新平| 南昌县| 东安县| 杂多县|