最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年10月26日 10:01:26   作者:果凍  
一直都在使用注解,但是一直都沒(méi)有用的很明白,后來(lái)被逼的發(fā)現(xiàn)不搞明白真的就沒(méi)有辦法愉快的寫(xiě)代碼了,所以,這篇《Java中的注解學(xué)習(xí)筆記》就呼之欲出了

注解說(shuō)明

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

內(nèi)置注解

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

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

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

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

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

3.從Java 7開(kāi)始,額外添加了3個(gè)注解:

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

元注解

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

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

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

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

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

Target類型 描述
ElementType.TYPE 可以應(yīng)用于類的任何元素。
ElementType.FIELD 可以應(yīng)用于字段或?qū)傩浴?/td>
ElementType.METHOD 可以應(yīng)用于方法級(jí)注釋。
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)用于任何使用類型的語(yǔ)句中(例如聲明語(yǔ)句、泛型和強(qiáng)制轉(zhuǎn)換語(yǔ)句中的類型)

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

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

自定義注解

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

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

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

同時(shí)需要注意以下事項(xiàng):

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

規(guī)則知道了,下面我來(lái)編碼實(shí)現(xiàn)一個(gè)自定義的注解。比如我們?cè)趯?shí)現(xiàn)一個(gè)自定義的ORM框架的時(shí)候,都會(huì)通過(guò)注解來(lái)實(shí)現(xiàn)數(shù)據(jù)表名與JAVA類的映射,表字段與JAVA類字段的映射關(guān)系,下面就來(lái)簡(jiǎn)單實(shí)現(xiàn)這個(gè)功能。

定義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());

           // 通過(guò)上面查詢到的數(shù)據(jù)拼接成SQL語(yǔ)句
           String name = "果凍";
           String sql =
                   "select * from " + tbStudent.value() + " where " + fieldStuName.name() + " = '" + name + "'";
           System.out.println("SQL=" + sql);
      } catch (Exception e) {
           // Handle the exception
      }
  }
}

通過(guò)上面的代碼,有木有感受到自定義注解還是非常簡(jiǎn)單的;同時(shí)有沒(méi)有感覺(jué)到注解這個(gè)功能是非常強(qiáng)大的。

總結(jié)

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

以上就是Java 注解學(xué)習(xí)筆記的詳細(xì)內(nèi)容,更多關(guān)于Java 注解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java詳解entity轉(zhuǎn)換到vo過(guò)程

    Java詳解entity轉(zhuǎn)換到vo過(guò)程

    這篇文章將用實(shí)例來(lái)和大家介紹一下entity轉(zhuǎn)換到vo的方法過(guò)程。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下
    2022-06-06
  • Java解決線程的不安全問(wèn)題之volatile關(guān)鍵字詳解

    Java解決線程的不安全問(wèn)題之volatile關(guān)鍵字詳解

    這篇文章主要介紹了Java解決線程的不安全問(wèn)題之volatile關(guān)鍵字詳解,可見(jiàn)性指一個(gè)線程對(duì)共享變量值的修改,能夠及時(shí)地被其他線程看到,而 volatile 關(guān)鍵字就保證內(nèi)存的可見(jiàn)性,需要的朋友可以參考下
    2023-08-08
  • mybatis-plus自動(dòng)生成代碼的示例代碼

    mybatis-plus自動(dòng)生成代碼的示例代碼

    這篇文章主要介紹了mybatis-plus自動(dòng)生成代碼的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java面向?qū)ο笕筇匦约岸鄳B(tài)解析

    Java面向?qū)ο笕筇匦约岸鄳B(tài)解析

    這篇文章主要介紹了Java面向?qū)ο笕筇匦约岸鄳B(tài)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • String s = new String(''a '') 到底產(chǎn)生幾個(gè)對(duì)象

    String s = new String(''a '') 到底產(chǎn)生幾個(gè)對(duì)象

    這篇文章主要介紹了String s = new String(" a ") 到底產(chǎn)生幾個(gè)對(duì)象,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 教你如何在Intellij IDEA中集成Gitlab

    教你如何在Intellij IDEA中集成Gitlab

    今天來(lái)簡(jiǎn)單說(shuō)下,如何在IDEA中集成gitlab項(xiàng)目,默認(rèn)情況下IDEA中的 VCS => Checkout From Version Control 選項(xiàng)中是沒(méi)有g(shù)itlab這一項(xiàng)的,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10
  • 使用springboot 獲取控制器參數(shù)的幾種方法小結(jié)

    使用springboot 獲取控制器參數(shù)的幾種方法小結(jié)

    這篇文章主要介紹了使用springboot 獲取控制器參數(shù)的幾種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringCloud HystrixDashboard服務(wù)監(jiān)控詳解

    SpringCloud HystrixDashboard服務(wù)監(jiān)控詳解

    Hystrix Dashboard 是Spring Cloud中查看Hystrix實(shí)例執(zhí)行情況的一種儀表盤組件,支持查看單個(gè)實(shí)例和查看集群實(shí)例,本文將對(duì)其服務(wù)監(jiān)控學(xué)習(xí)
    2022-11-11
  • Java環(huán)境下高德地圖Api的使用方式

    Java環(huán)境下高德地圖Api的使用方式

    這篇文章主要介紹了Java環(huán)境下高德地圖Api的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • spring boot使用logback實(shí)現(xiàn)多環(huán)境日志配置詳解

    spring boot使用logback實(shí)現(xiàn)多環(huán)境日志配置詳解

    這篇文章主要介紹了spring boot使用logback實(shí)現(xiàn)多環(huán)境日志配置詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08

最新評(píng)論

章丘市| 霍林郭勒市| 且末县| 枣强县| 河池市| 神农架林区| 富顺县| 清水河县| 桂阳县| 武功县| 万州区| 西乡县| 阿图什市| 南昌县| 南召县| 许昌市| 慈溪市| 吉木萨尔县| 江油市| 西藏| 大港区| 福安市| 博乐市| 彩票| 闸北区| 秭归县| 靖江市| 黔江区| 长宁县| 乡城县| 马关县| 榕江县| 广汉市| 沂源县| 深圳市| 奎屯市| 资兴市| 松原市| 喀喇沁旗| 含山县| 承德县|