亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于Java注解(Annotation)的自定義注解入門(mén)介紹

 更新時(shí)間:2013年04月24日 09:04:26   作者:  
要深入學(xué)習(xí)注解,我們就必須能定義自己的注解,并使用注解,在定義自己的注解之前,我們就必須要了解Java為我們提供的元注解和相關(guān)定義注解的語(yǔ)法

  要深入學(xué)習(xí)注解,我們就必須能定義自己的注解,并使用注解,在定義自己的注解之前,我們就必須要了解Java為我們提供的元注解和相關(guān)定義注解的語(yǔ)法。

--------------------------------------------------------------------------------

元注解:

  元注解的作用就是負(fù)責(zé)注解其他注解。Java5.0定義了4個(gè)標(biāo)準(zhǔn)的meta-annotation類(lèi)型,它們被用來(lái)提供對(duì)其它 annotation類(lèi)型作說(shuō)明。Java5.0定義的元注解:
    1.@Target,
    2.@Retention,
    3.@Documented,
    4.@Inherited
  這些類(lèi)型和它們所支持的類(lèi)在java.lang.annotation包中可以找到。下面我們看一下每個(gè)元注解的作用和相應(yīng)分參數(shù)的使用說(shuō)明。

--------------------------------------------------------------------------------

  @Target:

   @Target說(shuō)明了Annotation所修飾的對(duì)象范圍:Annotation可被用于 packages、types(類(lèi)、接口、枚舉、Annotation類(lèi)型)、類(lèi)型成員(方法、構(gòu)造方法、成員變量、枚舉值)、方法參數(shù)和本地變量(如循環(huán)變量、catch參數(shù))。在Annotation類(lèi)型的聲明中使用了target可更加明晰其修飾的目標(biāo)。

  作用:用于描述注解的使用范圍(即:被描述的注解可以用在什么地方)

  取值(ElementType)有:

    1.CONSTRUCTOR:用于描述構(gòu)造器
    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部變量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述參數(shù)
    7.TYPE:用于描述類(lèi)、接口(包括注解類(lèi)型) 或enum聲明

  使用實(shí)例:  

復(fù)制代碼 代碼如下:

@Target(ElementType.TYPE)
public @interface Table {
    /**
     * 數(shù)據(jù)表名稱(chēng)注解,默認(rèn)值為類(lèi)名稱(chēng)
     * @return
     */
    public String tableName() default "className";
}

@Target(ElementType.FIELD)
public @interface NoDBColumn {

}


  注解Table 可以用于注解類(lèi)、接口(包括注解類(lèi)型) 或enum聲明,而注解NoDBColumn僅可用于注解類(lèi)的成員變量。

--------------------------------------------------------------------------------

  @Retention:

  @Retention定義了該Annotation被保留的時(shí)間長(zhǎng)短:某些Annotation僅出現(xiàn)在源代碼中,而被編譯器丟棄;而另一些卻被編譯在class文件中;編譯在class文件中的Annotation可能會(huì)被虛擬機(jī)忽略,而另一些在class被裝載時(shí)將被讀?。ㄕ?qǐng)注意并不影響class的執(zhí)行,因?yàn)锳nnotation與class在使用上是被分離的)。使用這個(gè)meta-Annotation可以對(duì) Annotation的“生命周期”限制。

  作用:表示需要在什么級(jí)別保存該注釋信息,用于描述注解的生命周期(即:被描述的注解在什么范圍內(nèi)有效)

  取值(RetentionPoicy)有:

    1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在運(yùn)行時(shí)有效(即運(yùn)行時(shí)保留)

  Retention meta-annotation類(lèi)型有唯一的value作為成員,它的取值來(lái)自java.lang.annotation.RetentionPolicy的枚舉類(lèi)型值。具體實(shí)例如下:

復(fù)制代碼 代碼如下:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    public String name() default "fieldName";
    public String setFuncName() default "setField";
    public String getFuncName() default "getField";
    public boolean defaultDBValue() default false;
}

   Column注解的的RetentionPolicy的屬性值是RUTIME,這樣注解處理器可以通過(guò)反射,獲取到該注解的屬性值,從而去做一些運(yùn)行時(shí)的邏輯處理

--------------------------------------------------------------------------------

  @Documented:

  @Documented用于描述其它類(lèi)型的annotation應(yīng)該被作為被標(biāo)注的程序成員的公共API,因此可以被例如javadoc此類(lèi)的工具文檔化。Documented是一個(gè)標(biāo)記注解,沒(méi)有成員。

復(fù)制代碼 代碼如下:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {
    public String name() default "fieldName";
    public String setFuncName() default "setField";
    public String getFuncName() default "getField";
    public boolean defaultDBValue() default false;
}

  @Inherited:

  @Inherited 元注解是一個(gè)標(biāo)記注解,@Inherited闡述了某個(gè)被標(biāo)注的類(lèi)型是被繼承的。如果一個(gè)使用了@Inherited修飾的annotation類(lèi)型被用于一個(gè)class,則這個(gè)annotation將被用于該class的子類(lèi)。

  注意:@Inherited annotation類(lèi)型是被標(biāo)注過(guò)的class的子類(lèi)所繼承。類(lèi)并不從它所實(shí)現(xiàn)的接口繼承annotation,方法并不從它所重載的方法繼承annotation。

  當(dāng)@Inherited annotation類(lèi)型標(biāo)注的annotation的Retention是RetentionPolicy.RUNTIME,則反射API增強(qiáng)了這種繼承性。如果我們使用java.lang.reflect去查詢(xún)一個(gè)@Inherited annotation類(lèi)型的annotation時(shí),反射代碼檢查將展開(kāi)工作:檢查class和其父類(lèi),直到發(fā)現(xiàn)指定的annotation類(lèi)型被發(fā)現(xiàn),或者到達(dá)類(lèi)繼承結(jié)構(gòu)的頂層。

  實(shí)例代碼:

復(fù)制代碼 代碼如下:

/**
 *
 * @author peida
 *
 */
@Inherited
public @interface Greeting {
    public enum FontColor{ BULE,RED,GREEN};
    String name();
    FontColor fontColor() default FontColor.GREEN;
}


--------------------------------------------------------------------------------

自定義注解:

  使用@interface自定義注解時(shí),自動(dòng)繼承了java.lang.annotation.Annotation接口,由編譯程序自動(dòng)完成其他細(xì)節(jié)。在定義注解時(shí),不能繼承其他的注解或接口。@interface用來(lái)聲明一個(gè)注解,其中的每一個(gè)方法實(shí)際上是聲明了一個(gè)配置參數(shù)。方法的名稱(chēng)就是參數(shù)的名稱(chēng),返回值類(lèi)型就是參數(shù)的類(lèi)型(返回值類(lèi)型只能是基本類(lèi)型、Class、String、enum)。可以通過(guò)default來(lái)聲明參數(shù)的默認(rèn)值。

  定義注解格式:
  public @interface 注解名 {定義體}

  注解參數(shù)的可支持?jǐn)?shù)據(jù)類(lèi)型:

    1.所有基本數(shù)據(jù)類(lèi)型(int,float,boolean,byte,double,char,long,short)
    2.String類(lèi)型
    3.Class類(lèi)型
    4.enum類(lèi)型
    5.Annotation類(lèi)型
    6.以上所有類(lèi)型的數(shù)組

  Annotation類(lèi)型里面的參數(shù)該怎么設(shè)定:
  第一,只能用public或默認(rèn)(default)這兩個(gè)訪問(wèn)權(quán)修飾.例如,String value();這里把方法設(shè)為defaul默認(rèn)類(lèi)型;   
  第二,參數(shù)成員只能用基本類(lèi)型byte,short,char,int,long,float,double,boolean八種基本數(shù)據(jù)類(lèi)型和 String,Enum,Class,annotations等數(shù)據(jù)類(lèi)型,以及這一些類(lèi)型的數(shù)組.例如,String value();這里的參數(shù)成員就為String;  
  第三,如果只有一個(gè)參數(shù)成員,最好把參數(shù)名稱(chēng)設(shè)為"value",后加小括號(hào).例:下面的例子FruitName注解就只有一個(gè)參數(shù)成員。

  簡(jiǎn)單的自定義注解和使用注解實(shí)例:

復(fù)制代碼 代碼如下:

package annotation;

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

/**
 * 水果名稱(chēng)注解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
    String value() default "";
}


復(fù)制代碼 代碼如下:

package annotation;

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

/**
 * 水果顏色注解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
    /**
     * 顏色枚舉
     * @author peida
     *
     */
    public enum Color{ BULE,RED,GREEN};

    /**
     * 顏色屬性
     * @return
     */
    Color fruitColor() default Color.GREEN;

}


復(fù)制代碼 代碼如下:

package annotation;

import annotation.FruitColor.Color;

public class Apple {

    @FruitName("Apple")
    private String appleName;

    @FruitColor(fruitColor=Color.RED)
    private String appleColor;

   

   
    public void setAppleColor(String appleColor) {
        this.appleColor = appleColor;
    }
    public String getAppleColor() {
        return appleColor;
    }

   
    public void setAppleName(String appleName) {
        this.appleName = appleName;
    }
    public String getAppleName() {
        return appleName;
    }

    public void displayName(){
        System.out.println("水果的名字是:蘋(píng)果");
    }
}


  定義了注解,并在需要的時(shí)候給相關(guān)類(lèi),類(lèi)屬性加上注解信息,如果沒(méi)有響應(yīng)的注解信息處理流程,注解可以說(shuō)是沒(méi)有實(shí)用價(jià)值。如何讓注解真真的發(fā)揮作用,主要就在于注解處理方法,下一步我們將通過(guò)注解實(shí)現(xiàn)一個(gè)簡(jiǎn)單的ORM,來(lái)深入學(xué)習(xí)注解,來(lái)利用注解!

相關(guān)文章

  • IDEA中maven無(wú)法下載源碼的解決方法

    IDEA中maven無(wú)法下載源碼的解決方法

    這篇文章主要為大家詳細(xì)介紹了當(dāng)IDEA中maven無(wú)法下載源碼時(shí)改如何解決,文中通過(guò)圖文為大家進(jìn)行了詳細(xì)講解,需要的小伙伴可以參考一下
    2023-08-08
  • Java中File文件操作類(lèi)的超詳細(xì)使用教程

    Java中File文件操作類(lèi)的超詳細(xì)使用教程

    File類(lèi)在包java.io.File下、代表操作系統(tǒng)的文件對(duì)象(文件、文件夾),File類(lèi)提供了諸如:定位文件,獲取文件本身的信息、刪除文件、創(chuàng)建文件(文件夾)等功能,下面這篇文章主要給大家介紹了關(guān)于Java中File文件操作類(lèi)的超詳細(xì)使用教程,需要的朋友可以參考下
    2023-01-01
  • Java多維數(shù)組詳解

    Java多維數(shù)組詳解

    大家好,本篇文章主要講的是Java多維數(shù)組詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • JSP、Servlet中g(shù)et請(qǐng)求和post請(qǐng)求的區(qū)別總結(jié)

    JSP、Servlet中g(shù)et請(qǐng)求和post請(qǐng)求的區(qū)別總結(jié)

    這篇文章主要介紹了JSP、Servlet中g(shù)et請(qǐng)求和post請(qǐng)求的區(qū)別總結(jié),列舉了多條不同點(diǎn),需要的朋友可以參考下
    2014-07-07
  • Hadoop源碼分析五hdfs架構(gòu)原理剖析

    Hadoop源碼分析五hdfs架構(gòu)原理剖析

    本篇是Hadoop源碼分析系列文章第五篇,主要介紹Hadoop的hdfs架構(gòu)原理剖析,后續(xù)本系列文章會(huì)持續(xù)更新,有需要的朋友可以借鑒參考下
    2021-09-09
  • Java并發(fā)編程線程間通訊實(shí)現(xiàn)過(guò)程詳解

    Java并發(fā)編程線程間通訊實(shí)現(xiàn)過(guò)程詳解

    這篇文章主要介紹了Java并發(fā)編程線程間通訊實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • java接口使用默認(rèn)方法的講解

    java接口使用默認(rèn)方法的講解

    在本篇文章里小編給大家整理了一篇關(guān)于java接口使用默認(rèn)方法的講解內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2021-04-04
  • Java遞歸基礎(chǔ)與遞歸的宏觀語(yǔ)意實(shí)例分析

    Java遞歸基礎(chǔ)與遞歸的宏觀語(yǔ)意實(shí)例分析

    這篇文章主要介紹了Java遞歸基礎(chǔ)與遞歸的宏觀語(yǔ)意,結(jié)合實(shí)例形式分析了java遞歸的相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • Java實(shí)現(xiàn)非阻塞式服務(wù)器的示例代碼

    Java實(shí)現(xiàn)非阻塞式服務(wù)器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的非阻塞式服務(wù)器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下
    2023-05-05
  • springboot處理url中帶斜杠/\字符的參數(shù)報(bào)400問(wèn)題

    springboot處理url中帶斜杠/\字符的參數(shù)報(bào)400問(wèn)題

    這篇文章主要介紹了springboot處理url中帶斜杠/\字符的參數(shù)報(bào)400問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評(píng)論