欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Java注解的詳細(xì)解析

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

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、雅安服務(wù)器托管、營(yíng)銷軟件、網(wǎng)站建設(shè)、魯?shù)榫W(wǎng)站維護(hù)、網(wǎng)站推廣。

基本特性

1、jdk 1.5之后才引入的。

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

java注解的作用分類

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

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

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

測(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

生成了一大堆的東西:

Java注解的詳細(xì)解析

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

注解來源分類

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

2、自定義的注解

1)格式, 以override為例:

Java注解的詳細(xì)解析

2)注解的本質(zhì)

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

MyAnnotation.java

public @interface MyAnnotation {}

我們通過編譯和反編譯看下最終是什么樣的結(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可以省略,直接填寫屬性值。
  • 如果是數(shù)組,需要用{}包含起來。
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();
  }
}

元注解

元注解是你在編寫注解的時(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

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

那就是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<&#63; extends Annotation> annotationType() {
    return null;
  }
}

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

看完上述內(nèi)容,是不是對(duì)Java注解的詳細(xì)解析有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文題目:Java注解的詳細(xì)解析
當(dāng)前地址:http://chinadenli.net/article18/jsidgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、網(wǎng)站改版移動(dòng)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
日本乱论一区二区三区| 沐浴偷拍一区二区视频| 亚洲国产成人久久一区二区三区| 爽到高潮嗷嗷叫之在现观看| 在线观看免费无遮挡大尺度视频| 国产精品不卡一区二区三区四区| 中国日韩一级黄色大片| 日韩欧美好看的剧情片免费| 国产精品一区二区高潮| 日本和亚洲的香蕉视频| 99精品国产一区二区青青| 黄片在线免费观看全集| 在线免费观看一二区视频| 日韩一区二区免费在线观看 | 国产三级欧美三级日韩三级| 尤物久久91欧美人禽亚洲| 亚洲av日韩一区二区三区四区 | 精品人妻一区二区三区免费看| 男生和女生哪个更好色| 日本一本在线免费福利| 国产原创激情一区二区三区| 国产午夜精品亚洲精品国产| 日韩美成人免费在线视频| 欧美又黑又粗大又硬又爽| 91国自产精品中文字幕亚洲| 又大又长又粗又猛国产精品| 日韩中文字幕人妻精品| 国产精品视频久久一区| 黄色国产自拍在线观看| 亚洲欧美日韩国产成人 | 日本91在线观看视频| 国产人妻精品区一区二区三区| 国产精欧美一区二区三区久久| 国产精品一区二区香蕉视频| 成年女人午夜在线视频| 激情图日韩精品中文字幕| 国产偷拍精品在线视频| 九九热在线视频观看最新| 91天堂素人精品系列全集| 欧美大胆女人的大胆人体| 亚洲超碰成人天堂涩涩|