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

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

 更新時間:2021年03月02日 10:37:13   作者:布禾  
這篇文章主要介紹了Java 注解的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下

簡介

Java注解是JDK1.5引入的一種注釋機(jī)制,它不會改變編譯器的編譯方式,Java編譯器對包含注解和不包含注解的代碼會生成相同的Java虛擬機(jī)指令。在實(shí)際應(yīng)用中,注解只是一種標(biāo)識,具體的操作需要借助其他工具來解析和處理。

注解語法

注解是使用@interface來定義的,所有注解都隱式的擴(kuò)展自java.lang.annotation.Annotation接口。

如下MyFirstAnnotation是一個自定義注解,它具有兩個參數(shù)name和value,默認(rèn)值都為空字符串。在它的定義之上還標(biāo)注了@Retention和@Target兩個元注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyFirstAnnotation {
  String name() default "";

  String value() default "";
}

注解參數(shù)類型是有限制的,必須限制在以下幾種類型中:

  1. 基本類型
  2. String
  3. Class
  4. enum類型
  5. 注解類型
  6. 由前面所述類型組成的數(shù)組

例如,如果不使用以上幾種,則會出現(xiàn)編譯錯誤:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyFirstAnnotation {
  String name() default "";

  Integer value() default 1;//包裝類型也不行,編譯錯誤
}

@Target和@Retention這種作用在注解上的注解,稱之為元注解。常用的元注解如下:

1.@Target,用于標(biāo)識注解可以標(biāo)注的位置,接收一個ElementType[]參數(shù)。參數(shù)取值可以參考ElementType枚舉類:

public enum ElementType {
  /** 類、接口(包括注釋類型)或枚舉聲明 */
  TYPE,

  /** 字段聲明(包括enum常量) */
  FIELD,

  /** 方法聲明 */
  METHOD,

  /** 形參聲明 */
  PARAMETER,

  /** 構(gòu)造函數(shù)聲明 */
  CONSTRUCTOR,

  /** 局部變量聲明 */
  LOCAL_VARIABLE,

  /** 注解類型聲明 */
  ANNOTATION_TYPE,

  /** 包聲明 */
  PACKAGE,

  /**
   * 類型參數(shù)聲明
   *
   * @since 1.8
   */
  TYPE_PARAMETER,

  /**
   * 任何類型名稱
   *
   * @since 1.8
   */
  TYPE_USE
}

當(dāng)指定的@Target和注解的使用位置不匹配時就會出現(xiàn)編譯錯誤,如下所示,@Target(ElementType.METHOD)表示MyFirstAnnotation注解只能用來標(biāo)注方法,標(biāo)注在類上就出現(xiàn)編譯錯誤:

//編譯錯誤
@MyFirstAnnotation
public class Demo {

  //正確
  @MyFirstAnnotation
  public void doSomeThing(){
  }

}

2.@Retention,用于標(biāo)識注解可以保留多久,接收一個RetentionPolicy參數(shù),參數(shù)取值可以參考RetentionPolicy枚舉類:

public enum RetentionPolicy {
  /**
   * 表示注解只會存在于.java的源代碼文件中,不會保留到編譯后的.class文件中
   */
  SOURCE,

  /**
   * 表示注解可以保留到.class文件中,但是不會被Java虛擬機(jī)所加載
   */
  CLASS,

  /**
   * 表示注解可以保留到.class文件中,并由虛擬機(jī)加載
   */
  RUNTIME
}

3.@Documented,表示這個注解能出現(xiàn)在javadoc中。

4.@Inherited,表示當(dāng)這個注解用于一個類的時候,能夠自動的被它的子類繼承。

5.@Repeatable,表示這個注解可以在同一個位置應(yīng)用多次。

默認(rèn)情況下,同一個位置添加多個重復(fù)注解會有編譯錯誤:

public class Demo {
  //編譯錯誤
  @MyFirstAnnotation(name = "張三")
  @MyFirstAnnotation(name = "李四")
  @MyFirstAnnotation(name = "王五")
  public void doSomeThing(){
  }

}

可以通過添加@Repeatable元注解來使@MyFirstAnnotation能重復(fù)使用。
首先需要創(chuàng)建一個容器注解@MyFirstAnnotations,容器注解@MyFirstAnnotations必須要有一個參數(shù)value,并且其類型為MyFirstAnnotation[]:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyFirstAnnotations {
  MyFirstAnnotation[] value();
}

然后添加@Repeatable注解,并指定容器注解。

@Repeatable(MyFirstAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyFirstAnnotation {
  String name() default "";

  String value() default "";
}

關(guān)于注解的使用需要注意,注解參數(shù)是不能為null的,默認(rèn)值也是不能為null。

自定義注解測試

定義注解@RepeatMethod,包含int類型參數(shù)value。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RepeatMethod {

  int value() default 1;

}

在doSomeThing方法上應(yīng)用注解。如果要指定的注解參數(shù)為value,并且沒有指定其他的參數(shù)值時,可以采用簡寫的方式,省略參數(shù)名和等號。

public class Demo {
  @RepeatMethod(5)
  public void doSomeThing(){
    System.out.println("----注解測試----");
  }
}

通過反射獲取注解信息,然后做對應(yīng)的處理,如假設(shè)@RepeatMethod注解的作用是重復(fù)調(diào)用被標(biāo)注的方法,參數(shù)value是指定重復(fù)調(diào)用方法的次數(shù):

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MyDemo {
  public static void main(String[] args) throws IllegalAccessException, InstantiationException, InvocationTargetException {
    Class cla = Demo.class;
    Method[] methods = cla.getMethods();
    Object demo = cla.newInstance();
    for (Method method : methods){
      //判斷方法上是否有標(biāo)注@RepeatMethod注解
      if(method.isAnnotationPresent(RepeatMethod.class)){
        //獲取RepeatMethod注解的參數(shù)值
        RepeatMethod repeatMethod = method.getAnnotation(RepeatMethod.class);
        for (int i = 0;i < repeatMethod.value(); i++)
        method.invoke(demo, null);
      }
    }
  }
}

輸出結(jié)果:

----注解測試----
----注解測試----
----注解測試----
----注解測試----
----注解測試----

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

相關(guān)文章

  • Java9中對集合類擴(kuò)展的of方法解析

    Java9中對集合類擴(kuò)展的of方法解析

    這篇文章主要介紹了Java9 中對集合類擴(kuò)展的of方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 使用@RequestBody傳遞多個不同對象方式

    使用@RequestBody傳遞多個不同對象方式

    這篇文章主要介紹了使用@RequestBody傳遞多個不同對象方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 淺談Mybatis樂觀鎖插件

    淺談Mybatis樂觀鎖插件

    這篇文章主要介紹了淺談Mybatis樂觀鎖插件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Java 四種基本加密算法分析

    Java 四種基本加密算法分析

    這篇文章主要介紹了Java 四種基本加密算法分析的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • spring data jpa開啟批量插入、批量更新的問題解析

    spring data jpa開啟批量插入、批量更新的問題解析

    這篇文章主要介紹了spring data jpa開啟批量插入、批量更新問題,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • java基于servlet的文件異步上傳

    java基于servlet的文件異步上傳

    本篇文章主要介紹了java基于servlet的文件異步上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-10-10
  • Java中使用正則表達(dá)式的一個簡單例子及常用正則分享

    Java中使用正則表達(dá)式的一個簡單例子及常用正則分享

    這篇文章主要介紹了Java中使用正則表達(dá)式的一個簡單例子及常用正則分享,本文用一個驗(yàn)證Email的例子講解JAVA中如何使用正則,并羅列了一些常用的正則表達(dá)式,需要的朋友可以參考下
    2015-06-06
  • Java基礎(chǔ)之文件和目錄操作

    Java基礎(chǔ)之文件和目錄操作

    這篇文章主要介紹了Java基礎(chǔ)之文件和目錄操作,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Java常見面試題之final在java中的作用是什么

    Java常見面試題之final在java中的作用是什么

    這篇文章主要介紹了Java常見面試題之final在java中的作用是什么,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot集成MybatisPlus報錯的解決方案

    SpringBoot集成MybatisPlus報錯的解決方案

    這篇文章主要介紹了SpringBoot集成MybatisPlus報錯的解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12

最新評論

桑日县| 浦城县| 浮梁县| 芷江| 长丰县| 贡山| 镇江市| 山东省| 建昌县| 景谷| 景泰县| 体育| 岑溪市| 方城县| 海阳市| 宜君县| 门源| 乳源| 兰考县| 龙泉市| 新龙县| 清丰县| 偏关县| 雷山县| 余江县| 南涧| 博乐市| 海城市| 宁乡县| 崇州市| 佳木斯市| 乐亭县| 乌拉特后旗| 新田县| 新沂市| 望江县| 横峰县| 远安县| 万安县| 屏南县| 图们市|