最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java-Java5.0注解全面解讀

 更新時間:2021年07月19日 11:13:26   作者:小小工匠  
這篇文章主要介紹了Java-Java5.0注解全面解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

概述

Java5.0注解可以看做Javadoc和Xdoclet標簽的延伸和發(fā)展,在Java5.0中可以自定義這些標簽,并通過Java語言的反射機制獲取類中標注的注解,完成特定的功能。

注解是代碼的附屬信息,它遵循一個基本的原則:注解不能直接干擾程序代碼的運行,無論增加或者刪除注解,代碼都能正常運行。

Java語言解釋器會忽略這些注解,而由第三方工具負責對注解進行處理。 第三方工具可以利用代碼中的注解間接控制程序代碼的運行,它們通過Java反射機制讀取注解的信息,并根據(jù)這些信息更改目標程序的邏輯。

元注解Meta-annotation

元注解的作用就是負責注解其他注解。

Java5.0定義了4個標準的meta-annotation類型,它們被用來提供對其它 annotation類型作說明。

Java5.0定義的元注解: 

  • - @Target
  • - @Retention
  • - @Documented
  • - @Inherited

這幾個類都在java.lang.annotation包中

@Target

@Target主要說明Annotation所修飾的對象范圍。

Annotation可被用于 packages、types(類、接口、枚舉、Annotation類型)、類型成員(方法、構(gòu)造方法、成員變量、枚舉值)、方法參數(shù)和本地變量(如循環(huán)變量、catch參數(shù))。

在Annotation類型的聲明中使用了target可更加明晰其修飾的目標。

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

取值(ElementType)有: @Target(ElementType.XXX)取值如下

  • - TYPE:類、接口、注解類、Enum聲明處,相應的注解稱為類型注解
  • - FIELD:類成員變量或者常量聲明處,相應的注解被稱為域值注解
  • - METHOD:方法處聲明,相應的注解稱為方法注解
  • - PARAMETER:參數(shù)聲明處,相應的注解稱為參數(shù)注解
  • - CONSTRUCTOR:構(gòu)造函數(shù)聲明處,相應的注解稱為構(gòu)造函數(shù)注解
  • - LOCAL_VARIABLE:局部變量聲明處,相應的注解稱為局域比納涼注解
  • - PACKAGE:包聲明處,相應的注解被稱為包注解

舉例:

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;
/**
 *
 * @Description: 注解@DataSource既可以加在方法上,也可以加在接口或者接口的實現(xiàn)類上
 *              
 * 
 * @author: Mr.Yang
 * @date: 2017年7月24日 下午9:59:29
 */
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {
    // 和配置文件中 dynamicDatasourceMap中的key保持一致
    public static String PR_RB = "dataSourcePR";
    public static String DR_RB = "dataSourceDR";
    public static String PR_CC = "dataSourceCC";
    /**
     * 
     * 
     * @Title: name
     * 
     * @Description: 如果僅標注@DataSource 默認為PR_RB數(shù)據(jù)庫實例
     * 
     * @return
     * 
     * @return: String
     */
    String name() default DataSource.PR_RB;
}

@Retention

@Retention定義了該Annotation被保留的時間長短.

某些Annotation僅出現(xiàn)在源代碼中,而被編譯器丟棄;

而另一些卻被編譯在class文件中,編譯在class文件中的Annotation可能會被虛擬機忽略,

而另一些在class被裝載時將被讀?。ú⒉挥绊慶lass的執(zhí)行,因為Annotation與class在使用上是被分離的)。

使用這個meta-Annotation可以對 Annotation的“生命周期”限制。

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

Retention meta-annotation類型有唯一的value作為成員,它的取值來自java.lang.annotation.RetentionPolicy的枚舉類型值。

這里寫圖片描述

取值(RetentionPoicy)有:

  • SOURCE:在源文件中有效(即源文件保留),單對應的字節(jié)碼文件將不再保留
  • CLASS:在class文件中有效(即class保留),但類家愛妻加載字節(jié)碼文件時不會將注解加載到JVM中,即運行期不能獲取注解信息
  • RUNTIME:在運行時有效(即運行時保留),注解信息在目標類加載到JVM后依然保留,在運行期可以通過反射機制讀取類中的注解信息

比如

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {
    .......
}

@Documented

@Documented用于描述其它類型的annotation應該被作為被標注的程序成員的公共API,因此可以被例如javadoc此類的工具文檔化。Documented是一個標記注解,沒有成員。

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {
    .......
}

@Inherited

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

@Inherited annotation類型是被標注過的class的子類所繼承。類并不從它所實現(xiàn)的接口繼承annotation,方法并不從它所重載的方法繼承annotation。

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

自定義注解

使用@interface自定義注解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其他細節(jié)。

在定義注解時,不能繼承其他的注解或接口。

@interface用來聲明一個注解,其中的每一個方法實際上是聲明了一個配置參數(shù)。

方法的名稱就是參數(shù)的名稱,返回值類型就是參數(shù)的類型(返回值類型只能是基本類型、Class、String、enum)。

可以通過default來聲明參數(shù)的默認值。

定義注解格式:

 public @interface 注解名 {定義體}

注解參數(shù)的可支持數(shù)據(jù)類型

所有基本數(shù)據(jù)類型(int,float,boolean,byte,double,char,long,short)

  • String類型
  • Class類型
  • enum類型
  • Annotation類型
  • 以上所有類型的數(shù)組

Annotation類型里面的參數(shù)設定規(guī)則:

第一,只能用public或默認(default)這兩個訪問權(quán)修飾.例如,String value();這里把方法設為defaul默認類型;   

第二,參數(shù)成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數(shù)據(jù)類型和 String,Enum,Class,annotations等數(shù)據(jù)類型,以及這一些類型的數(shù)組.例如,String value();這里的參數(shù)成員就為String;  

第三,如果只有一個參數(shù)成員,最好把參數(shù)名稱設為”value”,后加小括號.

實例

代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster

通常情況下,第三方工具不但負責處理特定的注解,其本身還提供了這些注解的定義。 事實上,定義注解類本身并不困難,Java提供了定義注解的語法,如上所述。

編寫注解類

我們著手來編寫一個簡單的注解類

package com.xgj.aop.spring.advisor.anno;
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;
/**
 * 
 * 
 * @ClassName: NeedTest
 * 
 * @Description: 自定義注解
 * 
 * @author: Mr.Yang
 * 
 * @date: 2017年8月23日 下午4:50:11
 */
// 聲明注解的保留期限
@Retention(RetentionPolicy.RUNTIME)
// 聲明可以使用該注解的目標類型
@Target(ElementType.METHOD)
// 可以被javadoc此類的工具文檔化
@Documented
public @interface NeedTestAnnotation { // 定義注解
    // 聲明注解成員
    boolean value() default false;
}

Java新語法規(guī)定使用@interface修飾符定義注解類,一個注解可以擁有多個成員,成員聲明和接口方法聲明類似,這里僅僅定義了一個成員。

成員聲明以下幾點限制:

  • 成員以無入?yún)?,無拋出異常的方式聲明, 以下方式是不合法的 比如 boolean value(String xx)、boolean value()throws Exception等是非法的
  • 可以通過default成員指定一個默認值,比如 String level() defalut “LOW_LEVEL”, int high() default 2 是合法的,當然也可以不指定默認值。
  • 成員類型是受限制的,成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數(shù)據(jù)類型和 String,Enum,Class,annotations等數(shù)據(jù)類型,以及這一些類型的數(shù)組.例如,String value();這里的參數(shù)成員就為String;   而 List foo() 、ForumServer value()是不合法的。

如果注解只有一個成員,成員名建議為value().

在使用時可以忽略成員和賦值號(=),比如 @NeedTestAnnotation(true).

當注解類擁有多個成員時,如果僅僅對value成員進行賦值,則也可不使用賦值號。

如果同時對多個成員進行賦值,這必須使用賦值號,比如 @DecalreParents(value=”XXX”,defaultImpl=XXX).

注解類可以沒有成員,沒有成員的注解稱為標注注解,解釋程序以標識注解存在與否進行相應的處理

此外,所有的注解都隱式繼承與java.lang.annotation.Annotation,但注解不允許顯示繼承其他的接口。

使用注解

我們在業(yè)務類中,使用NeedTestAnnotation注解,標注業(yè)務方法是否需要測試。

如下

package com.xgj.aop.spring.advisor.anno;
/**
 * 
 * 
 * @ClassName: ForumService
 * 
 * @Description: 演示使用自定義注解@NeedTestAnnotation
 * 
 * @author: Mr.Yang
 * 
 * @date: 2017年8月23日 下午5:15:18
 */
public class ForumService {
    @NeedTestAnnotation
    public void removeTopicId(int topicId) {
        System.out.println("remove topicId" + topicId);
    }
    @NeedTestAnnotation(true)
    public void removeForumId(int forumId) {
        System.out.println("remove forumId" + forumId);
    }
}

如果注解類和目標類不在同一個包中,這需要通過improt引用注解類。

在標注注解時,可以通過以下格式對注解成員進行賦值

@<注解名>(<成員名1>=<成員值1>,<成員名2>=<成員值2>,.....)

如果成員是數(shù)組類型,這可以通過{}進行賦值,比如 boolean數(shù)組的成員可以設置為{true,false,true}

訪問注解

我們說過,注解不會直接影響程序的運行,但是第三方程序或者工具可以利用代碼中的注解完成特殊的任務,間接控制程序的運行。 對于RetentionPolicy.RUNTIME保留期限的注解,可以通過反射機制訪問類中的注解。

在Java5.0中,Package、Class、Constructor、Method以及Field 等反射對象都新增了訪問注解信息的方法:<T extends Annotation>T getAnnotation(Class<T> annotationClass)該方法支持通過泛型直接返回注解對象.

下面通過反射來訪問注解,得到ForumService類中通過@NeedTestAnnotation注解所承載的測試需求

package com.xgj.aop.spring.advisor.anno;
import java.lang.reflect.Method;
import org.junit.Test;
/**
 * 
 * 
 * @ClassName: AnnotaitionSelfDefineTool
 * 
 * @Description: 訪問注解
 * 
 * @author: Mr.Yang
 * 
 * @date: 2017年8月23日 下午5:18:26
 */
public class AnnotaitionSelfDefineTool {
    @Test
    public void test() {
        // 得到對應的Class
        Class<ForumService> clazz = ForumService.class;
        // 因為標注在方法上,所以先得到對應的方法
        Method[] methods = clazz.getDeclaredMethods();
        System.out.println(clazz.getName() + " 有 " + methods.length + " 個方法");
        // 遍歷方法
        for (Method method : methods) {
            // 獲取方法上的注解
            NeedTestAnnotation needTestAnnotation = method
                    .getAnnotation(NeedTestAnnotation.class);
            // 判斷是否有標注此注解
            if (needTestAnnotation != null) {
                // 獲取注解中定義的值,做處理
                if (needTestAnnotation.value()) {
                    System.out.println(method.getName() + "需要測試");
                } else {
                    System.out.println(method.getName() + "不需要測試");
                }
            }
        }
    }
}

單元測試結(jié)果:

com.xgj.aop.spring.advisor.anno.ForumService 有 2 個方法

removeTopicId不需要測試

removeForumId需要測試

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Spring?Boot?條件注解詳情

    Spring?Boot?條件注解詳情

    這篇文章主要介紹了Spring?Boot?條件注解詳情,SpringBoot條件注解@Conditional,可用于根據(jù)某個特定的條件來判斷是否需要創(chuàng)建某個特定的Bean,下文更多相關介紹,需要的小伙伴可以參考一下
    2022-05-05
  • SpringBoot?啟動流程追蹤方法分享

    SpringBoot?啟動流程追蹤方法分享

    這篇文章主要介紹了SpringBoot?啟動流程追蹤方法分享的相關資料,需要的朋友可以參考下
    2023-08-08
  • 優(yōu)化Java虛擬機總結(jié)(jvm調(diào)優(yōu))

    優(yōu)化Java虛擬機總結(jié)(jvm調(diào)優(yōu))

    這篇文章主要介紹了優(yōu)化Java虛擬機總結(jié)(jvm調(diào)優(yōu)),具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • SpringBoot文件訪問映射如何實現(xiàn)

    SpringBoot文件訪問映射如何實現(xiàn)

    這篇文章主要介紹了SpringBoot文件訪問映射如何實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Spring Cloud之注冊中心Nacos的使用詳解

    Spring Cloud之注冊中心Nacos的使用詳解

    本文介紹SpringCloud Alibaba中的Nacos組件,對比了Nacos與Eureka的區(qū)別,展示了如何在項目中引入SpringCloud Alibaba和Nacos,并配置負載均衡,通過實際操作,驗證了服務注冊和負載均衡的功能,感興趣的朋友一起看看吧
    2025-03-03
  • Java的Struts框架中<results>標簽的使用方法

    Java的Struts框架中<results>標簽的使用方法

    這篇文章主要介紹了Java的Struts框架中<results>標簽的使用方法,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-11-11
  • 關于MyBatis中SqlSessionFactory和SqlSession簡解

    關于MyBatis中SqlSessionFactory和SqlSession簡解

    這篇文章主要介紹了MyBatis中SqlSessionFactory和SqlSession簡解,具有很好的參考價值,希望大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 淺談一下Spring中的createBean

    淺談一下Spring中的createBean

    createBean是創(chuàng)建Bean的主要方法, 該方法位于:AbstractBeanFactory的doGetBean方法中的createBean調(diào)用。本文就來淺談一下Spring中的createBean?,感興趣的可以了解一下
    2022-07-07
  • 一文了解Java讀寫鎖ReentrantReadWriteLock的使用

    一文了解Java讀寫鎖ReentrantReadWriteLock的使用

    ReentrantReadWriteLock稱為讀寫鎖,它提供一個讀鎖,支持多個線程共享同一把鎖。這篇文章主要講解一下ReentrantReadWriteLock的使用和應用場景,感興趣的可以了解一下
    2022-10-10
  • SpringMVC下實現(xiàn)Excel文件上傳下載

    SpringMVC下實現(xiàn)Excel文件上傳下載

    這篇文章主要為大家詳細介紹了SpringMVC下實現(xiàn)Excel文件上傳下載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03

最新評論

高密市| 锡林郭勒盟| 胶南市| 祁连县| 扎鲁特旗| 仙游县| 五河县| 宝丰县| 安化县| 永城市| 长乐市| 科技| 岫岩| 宣汉县| 金门县| 繁峙县| 景洪市| 济宁市| 伽师县| 光泽县| 申扎县| 中方县| 隆化县| 喜德县| 耿马| 拉萨市| 辽宁省| 札达县| 龙口市| 类乌齐县| 辽阳县| 永城市| 彰武县| 扬州市| 新化县| 湟源县| 精河县| 锡林郭勒盟| 昌都县| 涞水县| 阿鲁科尔沁旗|