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

Java注解使用及原理解析

 更新時(shí)間:2020年06月09日 09:28:32   作者:護(hù)花使者  
這篇文章主要介紹了Java注解使用及原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

基本特性

1、jdk 1.5之后才引入的。

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

java注解的作用分類

1、編寫(xiě)文檔:通過(guò)代碼標(biāo)識(shí)的注解生成文檔?!旧蒬oc文檔】

2、代碼分析:通過(guò)代碼標(biāo)識(shí)的注解對(duì)代碼進(jìn)行分析?!臼褂梅瓷洹?/p>

3、編譯檢查:通過(guò)代碼標(biāo)識(shí)的注解讓編譯器能夠?qū)崿F(xiàn)基本的編譯檢查?!緊verride】

測(cè)試類:

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

對(duì)于2、3兩點(diǎn)我們應(yīng)該是知道的。盡管可能不知道里面的原理。但是是平時(shí)都在用的。但是對(duì)于1點(diǎn)還可以生成doc文檔?

測(cè)試操作如下:

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

生成了一大堆的東西:

打開(kāi)TestCode.html可以發(fā)現(xiàn),我們的java api手冊(cè)就是這樣生產(chǎn)的。

注解來(lái)源分類

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

2、自定義的注解

1)格式, 以override為例:

2)注解的本質(zhì)

我們編寫(xiě)一個(gè)簡(jiǎn)單的注解

MyAnnotation.java

public @interface MyAnnotation {}

我們通過(guò)編譯和反編譯看下最終是什么樣的結(jié)果:

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

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

結(jié)果如下:

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

}

可以發(fā)現(xiàn)注解的本質(zhì)就是接口,這個(gè)接口繼承了jdk里面的Annotation接口。

3)注解的屬性

由于注解本質(zhì)為接口,那么里面可以定義未實(shí)現(xiàn)的方法。這些稱為注解的“屬性”。

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

  • 基本數(shù)據(jù)類型
  • String
  • 枚舉
  • 注解
  • 以及以上四種類型的數(shù)組

例子:

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

屬性的使用,需要注意幾點(diǎn):

  • 定義了屬性在使用的時(shí)候就要給屬性賦值,除非設(shè)置default值。如:String stringValue() default "aaa";
  • 如果屬性為value且屬性只有這一個(gè),那么value可以省略,直接填寫(xiě)屬性值。
  • 如果是數(shù)組,需要用{}包含起來(lái)。
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 {
  /**
   * 計(jì)算兩個(gè)數(shù)的和
   * @param a 整數(shù)a
   * @param b 整數(shù)b
   * @return 返回兩個(gè)數(shù)的和
   */
  public int add(int a, int b){
    return a+b;
  }

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

元注解

元注解是你在編寫(xiě)注解的時(shí)候,上面加的注解,就是注解的注解。主要有4個(gè)。

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

元注解的內(nèi)容,可以到j(luò)dk源碼里面看一下,更有利于理解。

解析注解

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

測(cè)試:

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

輸出結(jié)果:

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

是不是感覺(jué)可以當(dāng)配置文件使用。但是最主要的問(wèn)題是myAnnotation.integerValue(),myAnnotation.stringValue()為什么可以拿到對(duì)應(yīng)的值,這個(gè)也是最核心的問(wèn)題。

那就是getAnnotation里面返回了一個(gè)實(shí)現(xiàn)了MyAnnotation注解(注解的本質(zhì)是接口)的實(shí)例。這個(gè)類大概是長(zhǎng)這樣的。

package annotation_;

import java.lang.annotation.Annotation;

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

所以就可以通過(guò)抽象方法獲取到對(duì)應(yīng)的值。(如何生成這樣的一個(gè)類,只是學(xué)習(xí)注解,可以不關(guān)心。要不然,只能看里面的源碼。因?yàn)槿绻远x注解,你只會(huì)用到這一步,去獲取值。)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)時(shí)間動(dòng)態(tài)顯示方法匯總

    Java實(shí)現(xiàn)時(shí)間動(dòng)態(tài)顯示方法匯總

    這篇文章主要介紹了Java實(shí)現(xiàn)時(shí)間動(dòng)態(tài)顯示方法匯總,很實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • java發(fā)送form-data請(qǐng)求實(shí)現(xiàn)文件上傳的示例代碼

    java發(fā)送form-data請(qǐng)求實(shí)現(xiàn)文件上傳的示例代碼

    最近做一個(gè)需求,需要請(qǐng)求第三方接口上傳文件,該請(qǐng)求類型是form-data請(qǐng)求,本文就來(lái)介紹一下java發(fā)送form-data請(qǐng)求實(shí)現(xiàn)文件上傳的示例代碼,感興趣的可以了解一下
    2023-12-12
  • 關(guān)于Java實(shí)體類Serializable序列化接口的作用和必要性解析

    關(guān)于Java實(shí)體類Serializable序列化接口的作用和必要性解析

    序列化是將對(duì)象狀態(tài)轉(zhuǎn)化為可保持或者傳輸?shù)母袷竭^(guò)程,與序列化相反的是反序列化,完成序列化和反序列化,可以存儲(chǔ)或傳輸數(shù)據(jù),一般情況下,在定義實(shí)體類時(shí)會(huì)使用Serializable,需要的朋友可以參考下
    2023-05-05
  • 淺談java中靜態(tài)方法的重寫(xiě)問(wèn)題詳解

    淺談java中靜態(tài)方法的重寫(xiě)問(wèn)題詳解

    本篇文章是對(duì)java中靜態(tài)方法的重寫(xiě)問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Spring的嵌套事務(wù)(Propagation.NESTED)到底是個(gè)啥案例代碼講解

    Spring的嵌套事務(wù)(Propagation.NESTED)到底是個(gè)啥案例代碼講解

    SavePoint是數(shù)據(jù)庫(kù)事務(wù)中的一個(gè)概念,?可以將整個(gè)事務(wù)切割為不同的小事務(wù),可以選擇將狀態(tài)回滾到某個(gè)小事務(wù)發(fā)生時(shí)的樣子,本文通過(guò)案例代碼講解Spring的嵌套事務(wù)(Propagation.NESTED)到底是個(gè)啥,感興趣的朋友跟隨小編一起看看吧
    2023-01-01
  • java實(shí)現(xiàn)文件拷貝的七種方式

    java實(shí)現(xiàn)文件拷貝的七種方式

    這篇文章主要介紹了java實(shí)現(xiàn)文件拷貝的七種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • MyBatis-Flex實(shí)現(xiàn)分頁(yè)查詢的示例代碼

    MyBatis-Flex實(shí)現(xiàn)分頁(yè)查詢的示例代碼

    在MyBatis-Flex中實(shí)現(xiàn)分頁(yè)查詢時(shí),需要注意維護(hù)一個(gè)獲取數(shù)據(jù)庫(kù)總數(shù)的方法,詳細(xì)介紹了UserService、UserServiceImpl類以及Mapper.xml配置,感興趣的可以了解一下
    2024-10-10
  • 基于spring如何實(shí)現(xiàn)事件驅(qū)動(dòng)實(shí)例代碼

    基于spring如何實(shí)現(xiàn)事件驅(qū)動(dòng)實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于基于spring如何實(shí)現(xiàn)事件驅(qū)動(dòng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • java輸入數(shù)字,輸出倒序的實(shí)例

    java輸入數(shù)字,輸出倒序的實(shí)例

    這篇文章主要介紹了java輸入數(shù)字,輸出倒序的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • 淺析Java中的動(dòng)態(tài)代理

    淺析Java中的動(dòng)態(tài)代理

    動(dòng)態(tài)代理指代理類和目標(biāo)類的關(guān)系在程序運(yùn)行的時(shí)候確定的,客戶通過(guò)代理類來(lái)調(diào)用目標(biāo)對(duì)象的方法。本文將通過(guò)案例詳細(xì)講解一下Java動(dòng)態(tài)代理的原理及實(shí)現(xiàn),需要的可以參考一下
    2022-09-09

最新評(píng)論