亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

java深度學(xué)習(xí)——注解

Eric / 2456人閱讀

摘要:的在日常開(kāi)發(fā),特別是開(kāi)發(fā)中使用廣泛,各種框架,測(cè)試框架多多少少都會(huì)引入一些注解。的功能是作用于程序元數(shù)據(jù)的特殊類(lèi)型。而在編譯期使用注解則需要特殊的工具,本文不討論。可以看到通過(guò)類(lèi)中的反射方法獲取到了這個(gè)類(lèi)的注解以及其方法的注解。

Java的Annotation在日常開(kāi)發(fā),特別是java web開(kāi)發(fā)中使用廣泛,各種web框架,測(cè)試框架多多少少都會(huì)引入一些注解。若對(duì)java注解有一個(gè)全面深入的了解,對(duì)于我們的開(kāi)發(fā)工作會(huì)有很大的幫助。

Annotation的功能

Annotation是作用于java程序元數(shù)據(jù)的特殊類(lèi)型。本身和程序的邏輯隔離,程序的運(yùn)行邏輯不會(huì)被Annotation影響。因此,Annotation在程序中的作用僅限于提供一種信息,定義Annotaiton時(shí)即把這種信息和被Annotation修飾的class,method,package等關(guān)聯(lián)了起來(lái)。感興趣的外部程序(如編譯器,運(yùn)行時(shí)檢查系統(tǒng),框架,工具等)即可通過(guò)反射機(jī)制從被修飾類(lèi)型上獲取到關(guān)聯(lián)的Annotation,從而實(shí)現(xiàn)特殊的功能。因此可以說(shuō)Annotaion是一種特殊的注釋?zhuān)墙o框架,編譯器,運(yùn)行時(shí)檢查系統(tǒng)等外部系統(tǒng)看的注釋。

Anntation可以在運(yùn)行時(shí)使用,也可以在編譯時(shí)使用。在運(yùn)行時(shí),Annotation是class類(lèi)的一部分,獲取Annotation信息需要通過(guò)Class對(duì)象。而在編譯期使用注解則需要特殊的工具,本文不討論。

定義Annotation

Annotation是java中一種獨(dú)立的類(lèi)型,用@interface聲明,且繼承了Annotation接口。定義一個(gè)Annotation的目的無(wú)非是想注明一個(gè)類(lèi),一個(gè)field,乃至一個(gè)package擁有某項(xiàng)信息。因此Anntation的定義是非常輕量的,唯一要做的也只是定義在@interface體中定義一些name value對(duì),定義形式類(lèi)似于沒(méi)有方法體的方法。這些name可以有默認(rèn)值也可以沒(méi)有默認(rèn)值。Annotation的域可以使用8種基本類(lèi)型和class,Enum等類(lèi)型,例如下面代碼所示:

@interface TestAnnotation{
    public String testNmae();
    public String testNameValue() default "test";
    public int testIntName() default 10;
}

此外,Annotation定義時(shí)需要采用一些元注解來(lái)指定注解的屬性,這些元注解作用于自定義注解,指定了自定義注解的可見(jiàn)范圍,作用對(duì)象,是否可繼承等屬性,具體可見(jiàn)https://docs.oracle.com/javas...。

@Retention
@Target
@Documented
@Inherited
@Repeatable
使用Annotation

Annotation的使用包括在編譯時(shí)使用和運(yùn)行時(shí)使用,編譯時(shí)使用需要Annotation工具,此文不討論,在運(yùn)行時(shí)使用需要用反射方法去獲取注解信息,然后根據(jù)獲取到的注解信息做自定義的處理。

處理Anntation和反射應(yīng)用一樣。首先獲取需要處理的類(lèi)或者方法等的Class對(duì)象,再用isAnnotationPresent方法檢測(cè)指定的Anntation類(lèi)型是否注解了該類(lèi),也可以用Class對(duì)象的getAnnotation方法獲取到指定的Anntation對(duì)象。

代碼清單1.1是一個(gè)簡(jiǎn)單的Annotation使用示例。

//1.1
// Description.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface Description{
    String value();
}

//AnnotationTest.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface AnnotationTest{
    String name();
}

//ClassWithAnnotation.java
@Description("this is a class with description annotation")
public class ClassWithAnnotation {

    @AnnotationTest(name="this is a method with annotation")
    public void doSth(){
        System.out.println("i have a annotation");
    }
}

//AnalysisAnnotation .java
public class AnalysisAnnotation {
    public static void main(String[] args){
        try{
            Class rtClass = Class.forName("annotation.ClassWithAnnotation");
            Method[] methods = rtClass.getMethods();
            boolean desctionExist = rtClass.isAnnotationPresent(Description.class);
            if(desctionExist){
                Description description = rtClass.getAnnotation(Description.class);
                System.out.println("class"s annotation value:"+description.value());
                for(Method method:methods){
                    if(method.isAnnotationPresent(AnnotationTest.class)){
                        AnnotationTest annotation = method.getAnnotation(AnnotationTest.class);
                        System.out.println("method"s anntation value:"+annotation.name());
                    }
                }
            }
        }
        catch(ClassNotFoundException e){
            e.printStackTrace();
        }
    }
}

運(yùn)行結(jié)果如上??梢钥吹酵ㄟ^(guò)AnalysisAnnotation類(lèi)中的反射方法獲取到了ClassWithAnnotation這個(gè)類(lèi)的注解以及其方法的注解。編譯時(shí)代碼即可這樣獲取到注解信息,加以利用。運(yùn)行時(shí)注解的一個(gè)常見(jiàn)例子是junit等測(cè)試框架,或根據(jù)注解來(lái)實(shí)現(xiàn)一些功能。

除了運(yùn)行時(shí)可以使用注解,在編譯時(shí)也可以用注解,這個(gè)需要特殊的工具支持。常用來(lái)自動(dòng)生成代碼。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/64669.html

相關(guān)文章

  • Java9模塊化學(xué)習(xí)筆記二之模塊設(shè)計(jì)模式

    摘要:但是模塊化當(dāng)中,無(wú)法掃描只有模塊中可以使用有兩種解決方案定義一個(gè)專(zhuān)門(mén)的資源模塊,并使用提供的接口,實(shí)現(xiàn)它,并將這個(gè)實(shí)現(xiàn)注冊(cè)為服務(wù)。有兩種方式使用或包名,包名模塊名使用運(yùn)行時(shí)動(dòng)態(tài)。 模塊設(shè)計(jì)的原則: 1、防止出現(xiàn)編譯時(shí)循環(huán)依賴(lài)(主要是編譯器不支持),但運(yùn)行時(shí)是允許循環(huán)依賴(lài)的,比如GUI應(yīng)用2、明確模塊的邊界 幾種模塊設(shè)計(jì): API模塊,聚合模塊(比如java.base) 可選依賴(lài) 兩種方...

    李文鵬 評(píng)論0 收藏0
  • java 日志脫敏框架 sensitive-新版本0.0.2-深度拷貝,屬性為對(duì)象和集合的支持

    摘要:項(xiàng)目介紹日志脫敏是常見(jiàn)的安全需求。特性基于注解的日志脫敏可以自定義策略實(shí)現(xiàn),策略生效條件常見(jiàn)的脫敏內(nèi)置方案深拷貝,且原始對(duì)象不用實(shí)現(xiàn)任何接口。放在集合屬性上,且屬性為普通對(duì)象作為演示,集合中為普通的字符串。 項(xiàng)目介紹 日志脫敏是常見(jiàn)的安全需求。普通的基于工具類(lèi)方法的方式,對(duì)代碼的入侵性太強(qiáng)。編寫(xiě)起來(lái)又特別麻煩。 本項(xiàng)目提供基于注解的方式,并且內(nèi)置了常見(jiàn)的脫敏方式,便于開(kāi)發(fā)。 用戶(hù)也可以...

    plokmju88 評(píng)論0 收藏0
  • Java開(kāi)發(fā)

    摘要:大多數(shù)待遇豐厚的開(kāi)發(fā)職位都要求開(kāi)發(fā)者精通多線程技術(shù)并且有豐富的程序開(kāi)發(fā)調(diào)試優(yōu)化經(jīng)驗(yàn),所以線程相關(guān)的問(wèn)題在面試中經(jīng)常會(huì)被提到。將對(duì)象編碼為字節(jié)流稱(chēng)之為序列化,反之將字節(jié)流重建成對(duì)象稱(chēng)之為反序列化。 JVM 內(nèi)存溢出實(shí)例 - 實(shí)戰(zhàn) JVM(二) 介紹 JVM 內(nèi)存溢出產(chǎn)生情況分析 Java - 注解詳解 詳細(xì)介紹 Java 注解的使用,有利于學(xué)習(xí)編譯時(shí)注解 Java 程序員快速上手 Kot...

    LuDongWei 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<