91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java注解的詳細解析

發布時間:2020-07-17 15:24:04 來源:億速云 閱讀:136 作者:小豬 欄目:編程語言

這篇文章主要講解了Java注解的詳細解析,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

基本特性

1、jdk 1.5之后才引入的。

2、用來說明程序的。(注釋是給程序員看的,注解就是給電腦看的)

java注解的作用分類

1、編寫文檔:通過代碼標識的注解生成文檔。【生成doc文檔】

2、代碼分析:通過代碼標識的注解對代碼進行分析。【使用反射】

3、編譯檢查:通過代碼標識的注解讓編譯器能夠實現基本的編譯檢查。【override】

測試類:

/**
 * 我的javadoc測試
 */
public class TestCode {
  /**
   * 計算兩個數的和
   * @param a 整數a
   * @param b 整數b
   * @return 返回兩個數的和
   */
  public int add(int a, int b){
    return a+b;
  }
}

對于2、3兩點我們應該是知道的。盡管可能不知道里面的原理。但是是平時都在用的。但是對于1點還可以生成doc文檔?

測試操作如下:

D:\soft\jdk\bin\javadoc.exe .\TestCode.java -encoding utf-8 -docEncoding utf-8 -charset utf-8

生成了一大堆的東西:

Java注解的詳細解析

打開TestCode.html可以發現,我們的java api手冊就是這樣生產的。

注解來源分類

1、jdk自帶的注解,如常見的override(重寫校驗),deprecated(表示棄用)

2、自定義的注解

1)格式, 以override為例:

Java注解的詳細解析

2)注解的本質

我們編寫一個簡單的注解

MyAnnotation.java

public @interface MyAnnotation {}

我們通過編譯和反編譯看下最終是什么樣的結果:

D:\soft\jdk\bin\javac.exe MyAnnotation.java

D:\soft\jdk\bin\javap.exe MyAnnotation.class

結果如下:

public interface MyAnnotation extends java.lang.annotation.Annotation {

}

可以發現注解的本質就是接口,這個接口繼承了jdk里面的Annotation接口。

3)注解的屬性

由于注解本質為接口,那么里面可以定義未實現的方法。這些稱為注解的“屬性”。

屬性的返回類型有(返回值不能為void):

  • 基本數據類型
  • String
  • 枚舉
  • 注解
  • 以及以上四種類型的數組

例子:

public enum Person {
  PS;
}
public @interface Annotation2 {
}
public @interface MyAnnotation {
  String stringValue();
  int integerValue();
  Person personValue();
  Annotation2 myAnnotationValue();
  String[] stringArrayValue();
}

屬性的使用,需要注意幾點:

  • 定義了屬性在使用的時候就要給屬性賦值,除非設置default值。如:String stringValue() default "aaa";
  • 如果屬性為value且屬性只有這一個,那么value可以省略,直接填寫屬性值。
  • 如果是數組,需要用{}包含起來。
public @interface MyAnnotation {
  String stringValue() default "xxx";
  int integerValue();
  String[] stringArrayValue();
}

public @interface Annotation2 {
  String value();
}

@MyAnnotation(integerValue = 1, stringArrayValue = {"aaa", "bbb"})
@Annotation2("default")
public class TestCode {
  /**
   * 計算兩個數的和
   * @param a 整數a
   * @param b 整數b
   * @return 返回兩個數的和
   */
  public int add(int a, int b){
    return a+b;
  }

  @Override
  public String toString() {
    return super.toString();
  }
}

元注解

元注解是你在編寫注解的時候,上面加的注解,就是注解的注解。主要有4個。

  • @target, 用于指定注解的使用位置。如@Target(ElementType.ANNOTATION_TYPE),@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})。
  • @Inherited,表示父類加了這個注解,子類也自動加上。
  • @Documented, 表示這個注解的信息在執行javadoc的時候是否抽取到api文檔中。
  • @Retention,表示注解被保留的階段,java類,class文件,以及被jvm讀取。總共三種。RetentionPolicy.SOURCE, RetentionPolicy.CLASS, RetentionPolicy.RUNTIME
     

元注解的內容,可以到jdk源碼里面看一下,更有利于理解。

解析注解

這個是最關鍵了,以上加了這么多的屬性,并且還為這些屬性附了值,那么是希望程序讀取這些值,進行使用的。那其實就是要看如何拿到這些注解配置的值。

測試:

MyAnnotition.java:

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

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
  String stringValue() default "xxx";
  int integerValue();
}

TestCode.java:

package annotation_;
@MyAnnotation(integerValue = 1)
public class TestCode {
  public static void main(String[] args) {
    Class<TestCode> testCodeClass = TestCode.class;
    MyAnnotation myAnnotation = testCodeClass.getAnnotation(MyAnnotation.class);
    int i = myAnnotation.integerValue();
    String s = myAnnotation.stringValue();
    System.out.printf("i = %d, s = %s\n", i, s);
  }
}

輸出結果:

Connected to the target VM, address: '127.0.0.1:49586', transport: 'socket'
i = 1, s = xxx
Disconnected from the target VM, address: '127.0.0.1:49586', transport: 'socket'

Process finished with exit code 0

是不是感覺可以當配置文件使用。但是最主要的問題是myAnnotation.integerValue(),myAnnotation.stringValue()為什么可以拿到對應的值,這個也是最核心的問題。

那就是getAnnotation里面返回了一個實現了MyAnnotation注解(注解的本質是接口)的實例。這個類大概是長這樣的。

package annotation_;

import java.lang.annotation.Annotation;

public class MyAnnotationImpl implements MyAnnotation{
  public String stringValue() {
    return "xxx";
  }
  public int integerValue() {
    return 0;
  }
  public Class<&#63; extends Annotation> annotationType() {
    return null;
  }
}

所以就可以通過抽象方法獲取到對應的值。(如何生成這樣的一個類,只是學習注解,可以不關心。要不然,只能看里面的源碼。因為如果自定義注解,你只會用到這一步,去獲取值。)

看完上述內容,是不是對Java注解的詳細解析有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

金湖县| 子长县| 林西县| 临夏市| 白城市| 赣榆县| 综艺| 江达县| 八宿县| 泸水县| 宜黄县| 铁岭市| 祁阳县| 齐齐哈尔市| 白城市| 甘德县| 沁源县| 清水河县| 叙永县| 长乐市| 方正县| 吉水县| 新兴县| 青铜峡市| 略阳县| 河池市| 石楼县| 定边县| 虹口区| 合水县| 鹰潭市| 成安县| 十堰市| 改则县| 宁化县| 夹江县| 秦皇岛市| 揭东县| 浑源县| 虎林市| 温州市|