欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 注解學習筆記

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

注解說明

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.作用在代碼的注解是:

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

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

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

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

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

元注解

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

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 可以應用于構造函數(shù)。
ElementType.LOCAL_VARIABLE 可以應用于局部變量。
ElementType.ANNOTATION_TYPE 可以應用于注釋類型。
ElementType.PACKAGE 可以應用于包聲明。
ElementType.TYPE_PARAMETER 1.8版本新增,應用于類型變量
ElementType.TYPE_USE 1.8版本新增,應用于任何使用類型的語句中(例如聲明語句、泛型和強制轉換語句中的類型)

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

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

自定義注解

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

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

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

同時需要注意以下事項:

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

規(guī)則知道了,下面我來編碼實現(xiàn)一個自定義的注解。比如我們在實現(xiàn)一個自定義的ORM框架的時候,都會通過注解來實現(xiàn)數(shù)據(jù)表名與JAVA類的映射,表字段與JAVA類字段的映射關系,下面就來簡單實現(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
      }
  }
}

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

總結

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

以上就是Java 注解學習筆記的詳細內(nèi)容,更多關于Java 注解的資料請關注腳本之家其它相關文章!

相關文章

  • Spring Boot 實現(xiàn)Restful webservice服務端示例代碼

    Spring Boot 實現(xiàn)Restful webservice服務端示例代碼

    這篇文章主要介紹了Spring Boot 實現(xiàn)Restful webservice服務端示例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • 深入解析Java中volatile的底層原理

    深入解析Java中volatile的底層原理

    這篇文章主要介紹了深入解析Java中volatile的底層原理,volatile關鍵字用于保證變量的可見性和禁止指令重排序,即當一個線程修改了volatile變量的值,其他線程能夠立即看到這個變量的最新值,而不是使用緩存中的舊值,需要的朋友可以參考下
    2023-07-07
  • Java中隨機函數(shù)變換的示例詳解

    Java中隨機函數(shù)變換的示例詳解

    這篇文章主要為大家詳細介紹了Java中隨機函數(shù)的變換,文中的示例代碼講解詳細,對我們學習Java有一定的幫助,感興趣的可以了解一下
    2022-08-08
  • java使用selenium自動化WebDriver等待的示例代碼

    java使用selenium自動化WebDriver等待的示例代碼

    顯式等待和隱式等待是WebDriver中兩種常用的等待方式,它們都可以用來等待特定的條件滿足后再繼續(xù)執(zhí)行代碼,本文給大家介紹java使用selenium自動化WebDriver等待,感興趣的朋友一起看看吧
    2023-09-09
  • 詳談Spring框架之事務管理

    詳談Spring框架之事務管理

    下面小編就為大家?guī)硪黄斦凷pring框架之事務管理。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • MyBatis中的collection兩種使用方法及效率比較

    MyBatis中的collection兩種使用方法及效率比較

    collection主要是應對表關系是一對多的情況,本文主要介紹了MyBatis中的collection兩種使用方法及效率比較,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 基于mybatis 動態(tài)SQL查詢總結

    基于mybatis 動態(tài)SQL查詢總結

    這篇文章主要介紹了mybatis 動態(tài)SQL查詢總結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中Maven Shade插件的具體使用

    Java中Maven Shade插件的具體使用

    Maven Shade插件它可以幫助你在構建項目時打包所有依賴項,并將其打包到一個單獨的JAR文件中,本文就介紹一下Maven Shade插件的具體使用,具有一定參考價值,感興趣的可以了解一下
    2023-08-08
  • IDEA如何添加配置文件到classpath中

    IDEA如何添加配置文件到classpath中

    這篇文章主要介紹了IDEA如何添加配置文件到classpath中,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • spring gateway如何解決跨域問題

    spring gateway如何解決跨域問題

    這篇文章主要介紹了spring gateway如何解決跨域問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評論