99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

Java中Annotation注解的作用是什么

這篇文章給大家介紹Java中Annotation注解的作用是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

十余年的肥鄉網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都全網營銷推廣的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整肥鄉建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯從事“肥鄉網站設計”,“肥鄉網站推廣”以來,每個客戶項目都認真落實執行。

一. 什么是Annotation

我們在平時的開發過程中看到很多如@Override,@SuppressWarnings,@Test等樣式的代碼就是注解,注解是放到類、構造器、方法、屬性、參數前的標記。

二. Annotation的作用

給某個類、方法..添加了一個注解,這個環節僅僅是做了一個標記,對代碼本身并不會造成任何影響,需要后續環節的配合,需要其他方法對該注解賦予業務邏輯處理。就如同我們在微信上發了一個共享定位,此時并沒有什么用,只有當后面其他人都進入了這個共享定位,大家之間的距離才能明確,才知道該怎么聚在一起。

注解分為三類:

2.1 編譯器使用到的注解

如@Override,@SuppressWarnings都是編譯器使用到的注解,作用是告訴編譯器一些事情,而不會進入編譯后的.class文件。

@Override:告訴編譯器檢查一下是否重寫了父類的方法;

@SuppressWarnings:告訴編譯器忽略該段代碼產生的警告;

對于開發人員來說,都是直接使用,無需進行其他操作

2.2 .class文件使用到的注解

需要通過工具對.class字節碼文件進行修改的一些注解,某些工具會在類加載的時候,動態修改用某注解標注的.class文件,從而實現一些特殊的功能,一次性處理完成后,并不會存在于內存中,都是非常底層的工具庫、框架會使用,對于開發人員來說,一般不會涉及到。

2.3 運行期讀取的注解

一直存在于JVM中,在運行期間可以讀取的注解,也是最常用的注解,如Spring的@Controller,@Service,@Repository,@AutoWired,Mybatis的@Mapper,Junit的@Test等,這類注解很多都是工具框架自定義在運行期間發揮特殊作用的注解,一般開發人員也可以自定義這類注解。

三. 定義Annotation

我們使用@interface來定義一個注解

/**
 * 定義一個Table注解
 */
public @interface Table {
    String value() default "";
}
/**
 * 定義一個Colum注解
 */
public @interface Colum {
    String value() default "";
    String name() default "";
    String dictType() default "";
}

這樣就簡單地將一個注解定義好了

我們上面定義的注解主要用到了String類型,但實際上還可以是基本數據類型(不能為包裝類)、枚舉類型。

注解也有一個約定俗成的東西,最常用的參數應該命名為value,同時一般情況下我們都會通過default參數設置一個默認值。

但這樣是不是就滿足于我們的使用了呢,我想把@Table注解僅用于類上,@Colum注解僅用于屬性上,怎么辦?而且開始提到的三類注解,一般開發人員用的都是運行期的注解,那我們定義的是嗎?

要回答這些問題,就需要引入一個概念“元注解”。

3.1 元注解

可以修飾注解的注解即為元注解,Java已經定義了一些元注解,我們可以直接使用。

3.1.1 @Target

顧名思義指定注解使用的目標對象,參數為ElementType[]

public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}

而下面是ElementType枚舉中定義的屬性,不設置Target的時候,除了TYPE_PARAMETER,TYPE_USE,其他地方都相當于配置上了。

public enum ElementType {
    /** 通過ElementType.TYPE可以修飾類、接口、枚舉 */
    TYPE,

    /** 通過ElementType.FIELD可以修飾類屬性 */
    FIELD,

    /** 通過ElementType.METHOD可以修飾方法 */
    METHOD,

    /** 通過ElementType.PARAMETER可以修飾參數(如構造器或者方法中的) */
    PARAMETER,

    /** 通過ElementType.CONSTRUCTOR可以修改構造器 */
    CONSTRUCTOR,

    /** 通過ElementType.LOCAL_VARIABLE可以修飾方法內部的局部變量 */
    LOCAL_VARIABLE,

    /** 通過ElementType.ANNOTATION_TYPE可以修飾注解 */
    ANNOTATION_TYPE,

    /** 通過ElementType.PACKAGE可以修飾包 */
    PACKAGE,

    /**
     * 可以用在Type的聲明式前
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * 可以用在所有使用Type的地方(如泛型、類型轉換等)
     *
     * @since 1.8
     */
    TYPE_USE
}

我們主要說一下ElementType.PACKAGE和1.8添加的ElementType.TYPE_PARAMETER和ElementType.TYPE_USE

ElementType.PACKAGE

@Target(ElementType.PACKAGE)
public @interface Table {
    String value() default "";
}

含義是用來修飾包,但我們用來修飾包的時候卻提示錯誤

Java中Annotation注解的作用是什么

我們按照提示創建package-info.java文件,這里需要注意一下,通過IDE 進行new --> Java Class是創建不了的,需要通過new File文件創建

@Table
package annotation;
class PackageInfo {
    public void hello() {
        System.out.println("hello");
    }
}

Java中Annotation注解的作用是什么

ElementType.TYPE_PARAMETER和ElementType.TYPE_USE

這兩個一起說,因為它們有相似之處。都是Java1.8后添加的

@Target(ElementType.TYPE_USE)
public @interface NoneEmpty {
    String value() default "";
}
@Target(ElementType.TYPE_PARAMETER)
public @interface NoneBlank {
    String value() default "";
}

Java中Annotation注解的作用是什么

很明顯使用ElementType.TYPE_PARMETER修飾的注解@NoneBlank無法在泛型使用的時候編譯通過,僅能用于類的泛型聲明,而通過ElementType.TYPE_USE修飾的注解@NoneEmpty可以。

3.1.2 @Retention

可以用于定義注解的生命周期,參數為枚舉RetentionPolicy,包括了SOURCE,CLASS,RUNTIME

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}
public enum RetentionPolicy {
    /**
     * 僅存在于源代碼中,編譯階段會被丟棄,不會包含于class字節碼文件中.
     */
    SOURCE,

    /**
     * 【默認策略】,在class字節碼文件中存在,在類加載的時被丟棄,運行時無法獲取到
     */
    CLASS,

    /**
     * 始終不會丟棄,可以使用反射獲得該注解的信息。自定義的注解最常用的使用方式。
     */
    RUNTIME
}
3.1.3 @Documented

表示是否將此注解的相關信息添加到javadoc文檔中

3.1.4 @Inherited

定義該注解和子類的關系,使用此注解聲明出來的自定義注解,在使用在類上面時,子類會自動繼承此注解,否則,子類不會繼承此注解。注意,使用@Inherited聲明出來的注解,只有在類上使用時才會有效,對方法,屬性等其他無效。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Person {
    String value() default "man";
}
@Person
public class Parent {
}
//子類也擁有@Person注解
class Son extends Parent {

}

3.2 定義注解小結

用@interface定義注解

可以添加多個參數,核心參數按約定用value,為每個參數可以設置默認值,參數類型包括基本類型、String和枚舉

可以使用元注解來修飾注解,元注解包括多個,必須設置@Target@Retention@Retention一般設置為RUNTIME

四. Annotation處理

我們前面已經提到光配置了注解,其實沒有作用,需要通過相應的代碼來實現該注解想要表達的邏輯。

注解定義后也是一種class,所有的注解都繼承自java.lang.annotation.Annotation,因此,讀取注解,需要使用反射API。

//定義的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Colum {
    String value() default "";
    //用于表示某個屬性代表的中文含義
    String name() default "";
}

用注解@Colum來修飾某個類的屬性

public class Person {

    @Colum(name = "姓名")
    private String name;

    @Colum(name = "性別")
    private String gender;

    @Colum(name = "年齡")
    private int age;

    @Colum(name = "住址")
    private String address;

    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getGender() {return gender;}
    public void setGender(String gender) {this.gender = gender;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
    public String getAddress() {return address;}
    public void setAddress(String address) {this.address = address;}
}

通過反射讀取這個類的所有字段的中文含義,并保存到list中,然后打印出來

public static void main(String[] args) throws ClassNotFoundException {
    List<String> columNames = new ArrayList<>();
    Class clazz = Class.forName("annotation.Person");
    //獲取Person類所有屬性
    Field[] fields = clazz.getDeclaredFields();
    for (Field field : fields){
        //獲取該屬性的Colum注解
        Colum colum = field.getAnnotation(Colum.class);
        //或者可以先判斷有無該注解
        field.isAnnotationPresent(Colum.class);
        //將該屬性通過注解配置好的中文含義取出來放到集合中
        columNames.add(colum.name());
    }

    //打印集合
    columNames.forEach((columName) -> System.out.println(columName));
}

結果如下:

姓名
性別
年齡
住址

比如我們有一些常見的應用場景,需要把網站上的列表導出成excel表格,我們通過注解的方式把列名配置好,再通過反射讀取實體需要導出(是否需要導出,也可通過注解配置)的每個字段的值,從而實現excel導出的組件。

五. 總結

本文只是拋磚引玉地講解了注解的基本概念,注解的作用,幾種元注解的功用以及使用方法,并通過一個簡單的例子講解了一下注解的處理,并不全面,文中通過Field講解了注解的基本Api,但注解還可以修飾類、構造器、方法等,也有相對應的注解處理方法,大家可自行查一下API手冊相關內容,大同小異,有不對之處,請批評指正,望共同進步,謝謝! <br>

<hr> <font color="Darkorange" size="4px"><b>關注微信公眾號【<a  href="http://mp.weixin.qq.com/s?__biz=MzU0OTg3ODQxNA==&mid=100000173&idx=1&sn=1af862786cc9126634f630a5d4d37d17&chksm=7ba86e4c4cdfe75aa0ce43095cbc2babff63affb0a5e18b5e8ff6a8f6fdc4b4bc129d6e7af10#rd">程序員的夢想</a>】,專注于Java,SpringBoot,SpringCloud,微服務,Docker以及前后端分離等全棧技術。</b></font>

關于Java中Annotation注解的作用是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

新聞標題:Java中Annotation注解的作用是什么
文章起源:http://www.yijiale78.com/article14/gjhige.html

成都網站建設公司_創新互聯,為您提供面包屑導航外貿建站網站設計Google網站營銷品牌網站制作

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

外貿網站建設