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

深入理解Java注解的使用方法

 更新時(shí)間:2017年07月19日 08:45:03   作者:天NULL  
這篇文章主要為大家詳細(xì)介紹了Java注解的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

注解是jdk1.5新增的特性.大家都知道,jdk1.5在java的發(fā)展史上有著劃時(shí)代的意義.而注解的出現(xiàn),在某種程度上顛覆了框架的設(shè)計(jì).比如,spring在注解出現(xiàn)后,改善了原先五大組件的模式,增加了基于注解的實(shí)現(xiàn)方式.現(xiàn)在重點(diǎn)講講注解的使用.

元注解:

      jdk1.5定義了4個(gè)元注解,元注解的作用是注解其他的注解.

       1.@Retention

       2.@Target

       3.@Documented

       4.@Inherited

       @Retention用于指明該注解存在的時(shí)機(jī).參數(shù)有三個(gè)值可選:RetentionPolicy.SOURCE,RetentionPolicy.CLASS,RetentionPolicy.RUNTIME可供選擇.分別表示:源碼中保留注解,字節(jié)碼文件中保留注解,運(yùn)行時(shí)保留注解.

       @Target用于指明注解能作用的范圍.比如參數(shù)中設(shè)置為ElementType.TYPE,表示作用于類和接口.如果你用來注解方法,則會(huì)發(fā)生編譯錯(cuò)誤.由此可見它的功能是通過編譯器實(shí)現(xiàn)的.

       @Documented表明該注解在使用javadoc工具生成開發(fā)文檔時(shí),也會(huì)被納入進(jìn)去.

       @Inherited表明,某個(gè)位置使用該注解,那么在存在Java繼承關(guān)系的地方,該注解也能被繼承過來.這個(gè)可能不好理解.下面的代碼加以說明.     

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


測(cè)試代碼:

public class TestAnnoInherated {
  public static void main(String[] args) {
    Annotation[] annos=new Goo().getClass().getAnnotations();
    for(Annotation a:annos){
      System.out.println(a);
    }
  }
}

@AnnoInherited
class Foo{
  
}

class Goo extends Foo{
  
}  

控制臺(tái)輸出:

@test.annotation.AnnoInherited()

上例中Goo前面并沒有加注解@AnnoInherited,但是父類Foo前面有,而@AnnoInherited加了元注解@Inherited,所以Foo能繼承過來.

自定義注解:

自定義注解的實(shí)例如下.

package test.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;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AnimalInfo {
  String shout() default "";
  
  //能不能看門
  boolean isGuard() default true;
}

測(cè)試代碼:

public class TestAnimalInfo {
  public static void main(String[] args) {
    Animal animal=new Animal();
    AnimalInfo info=animal.getClass().getAnnotation(AnimalInfo.class);
    if(info!=null){
      Annotation anno=info;//此處并沒有報(bào)錯(cuò).Annotation是一個(gè)接口.info是一個(gè)注解.這是因?yàn)榫幾g器會(huì)將注解編譯成接口,并且繼承了Annotation
      System.out.println("Annotation類信息:"+Annotation.class);
      System.out.println("AnimalInfo類信息:"+AnimalInfo.class);
      Class[] cs=AnimalInfo.class.getInterfaces();
      for(Class c:cs){
        System.out.println(c); //AnimalInfo編譯后就是一個(gè)接口,并且繼承了Annotation,這里得到了證實(shí).
      }
      System.out.println("info對(duì)象的類信息:"+info.getClass());
      if("wangwang".equals(info.shout())&&info.isGuard()){
        System.out.println("the animal is a dog");
      }else if("miaomiao".equals(info.shout())&&!info.isGuard()){
        System.out.println("the animal is a cat");
      }else{
        System.out.println("the animal is not a dog or cat");
      }
    }else{
      System.out.println("it's not a animal");
    }
  }
}

@AnimalInfo(shout="wangwang",isGuard=true)
class Animal{
  
}

控制臺(tái)輸出:

Annotation類信息:interface java.lang.annotation.Annotation
AnimalInfo類信息:interface test.annotation.AnimalInfo
interface java.lang.annotation.Annotation
info對(duì)象的類信息:class com.sun.proxy.$Proxy1
the animal is a dog

代碼分析:從控制臺(tái)可以看到.@AnimalInfo注解其實(shí)編譯后就是接口,并且它繼承了Annnotation.而通過反射獲得的注解實(shí)例,名字為$Proxy1,是一個(gè)類的對(duì)象.可見,該注解實(shí)例是JVM通過動(dòng)態(tài)代理技術(shù)生成的.這也揭示了注解特性的底層實(shí)現(xiàn)原理.關(guān)于注解的具體底層技術(shù)原理,這里不再詳談.

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java 一鍵部署 jar 包和 war 包

    java 一鍵部署 jar 包和 war 包

    這篇文章主要介紹了Java創(chuàng)建打包命令、創(chuàng)建啟動(dòng)文件等功能實(shí)現(xiàn)Java一鍵部署 jar 包和 war 包,感興趣的下伙伴可以參考下文
    2021-09-09
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(39)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(39)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Java Fluent Mybatis實(shí)戰(zhàn)之構(gòu)建項(xiàng)目與代碼生成篇上

    Java Fluent Mybatis實(shí)戰(zhàn)之構(gòu)建項(xiàng)目與代碼生成篇上

    Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。國(guó)內(nèi)又以Mybatis用的多,基于mybatis上的增強(qiáng)框架,又有mybatis plus和TK mybatis等。今天我們介紹一個(gè)新的mybatis增強(qiáng)框架 fluent mybatis
    2021-10-10
  • Java集合-HashMap

    Java集合-HashMap

    這篇文章主要介紹了Java集合HashMap,也叫散列表,是一種非常重要的數(shù)據(jù)結(jié)構(gòu),應(yīng)用場(chǎng)景及其豐富,許多緩存技術(shù)(比如memcached)的核心其實(shí)就是在內(nèi)存中維護(hù)一張大的哈希表,下面來看看文章的具體內(nèi)容吧,需要的小伙伴也可參考一下
    2022-01-01
  • mybatis 獲取無數(shù)據(jù)的字段不顯示的問題

    mybatis 獲取無數(shù)據(jù)的字段不顯示的問題

    這篇文章主要介紹了mybatis 獲取無數(shù)據(jù)的字段不顯示的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中使用byte[]獲取16位字符串的技巧分享

    Java中使用byte[]獲取16位字符串的技巧分享

    在Java編程中,處理字符編碼和字節(jié)數(shù)組時(shí),尤其是從??byte[]???數(shù)組中獲取字符串,可能會(huì)遇到字符集的復(fù)雜性問題,本文將介紹如何從一個(gè)??byte[]??數(shù)組中正確獲取16位字符串,需要的朋友可以參考下
    2024-08-08
  • Spring攔截器之HandlerInterceptor使用方式

    Spring攔截器之HandlerInterceptor使用方式

    這篇文章主要介紹了Spring攔截器之HandlerInterceptor使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • SpringCloud微服務(wù)之Hystrix組件實(shí)現(xiàn)服務(wù)熔斷的方法

    SpringCloud微服務(wù)之Hystrix組件實(shí)現(xiàn)服務(wù)熔斷的方法

    微服務(wù)架構(gòu)特點(diǎn)就是多服務(wù),多數(shù)據(jù)源,支撐系統(tǒng)應(yīng)用。這樣導(dǎo)致微服務(wù)之間存在依賴關(guān)系。這篇文章主要介紹了SpringCloud微服務(wù)之Hystrix組件實(shí)現(xiàn)服務(wù)熔斷的方法,需要的朋友可以參考下
    2019-08-08
  • 使用Mybatis更新時(shí)候只更新變更部分的方法

    使用Mybatis更新時(shí)候只更新變更部分的方法

    這篇文章主要介紹了使用Mybatis更新時(shí)候只更新變更部分的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java實(shí)現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的方法

    Java實(shí)現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,每一個(gè)鏈表都包含多個(gè)節(jié)點(diǎn),節(jié)點(diǎn)又包含兩個(gè)部分,一個(gè)是數(shù)據(jù)域(儲(chǔ)存節(jié)點(diǎn)含有的信息),一個(gè)是引用域(儲(chǔ)存下一個(gè)節(jié)點(diǎn)或者上一個(gè)節(jié)點(diǎn)的地址),需要的朋友可以參考下
    2022-01-01

最新評(píng)論