自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于 Java 注解(annotation)編程

開發(fā) 后端
今天在看以前寫的代碼,發(fā)現(xiàn)自己對注解的了解還不是非常透徹,經(jīng)常選擇性就忽視了對注解實現(xiàn)的探究,遂查詢資料學(xué)習(xí)了一下。

[[384114]]

 前言

今天在看以前寫的代碼,發(fā)現(xiàn)自己對注解的了解還不是非常透徹,經(jīng)常選擇性就忽視了對注解實現(xiàn)的探究,遂查詢資料學(xué)習(xí)了一下。

注解是什么

實現(xiàn)格式

從代碼來看我們知道注解的實現(xiàn)格式是:

  1. public @interface MyAnnotation{ 
  2.     屬性列表; 

 所以我們有了第一直覺,注解可能是一個接口。通過查詢資料得知(可以通過反編譯軟件),實際上 @interface 是自定義接口對 annotation 接口的繼承,@interface 實際是一個語法糖。 

  1. import java.lang.annotation.Annotation; 
  2. public interface MyAnnotation extends Annotation{ 
  3.     屬性列表; 

 使用位置

類、方法、成員變量、形參位置。

分類

不同角度,我們對注解能有不同的分類,但知道了注解的實現(xiàn)原理后就會明白,實際上用法和實現(xiàn)方法都是一回事。

來源

1. JDK注解:一般都是在編譯時起用作的注解,比如我們最為熟悉的 @Override。

2. 第三方框架注解

3. 自定義注解

運行機制(保留策略)

  1. @Retention({保留策略}) 
  2.     public @interface MyAnnotation{ 
  3.         屬性列表; 
  4.     } 

 1.源碼(SOURCE)注解:注解只在源碼中存在,編譯成.class文件就不存在了,也就是說只能起到 “看” 的作用。

2.編譯(CLASS)注解:注解在源碼和.class文件中都存在(JDK自帶注解都屬于編譯時注解),一般用來作語法校驗。

3.運行(RUNTIME)注解:在運行階段還起作用,甚至?xí)绊戇\行邏輯的注解(@Autowired屬于運行時注解),第三方框架和自定注解一般采用 runtime 的保留策略,能實現(xiàn)依賴注入、切面編程等功能。

元注解

實際在上面,我們已經(jīng)看到一個元注解了(@Retention)。元注解就是加在注解上描述注解的注解。 一共有5個。

1. @Documented

在生成javadoc的時候就會把@Documented注解給顯示出來。

2. @Target(關(guān)鍵)

限定作用位置,Method、Class等等。

9. @Inherited

被 @Inherited 注解的注解修飾了一個父類,如果他的子類沒有被其他注解修飾,則它的子類也繼承了父類的注解。

10. @Retention(關(guān)鍵)

上文的保留策略注解,影響注解作用。

6. @Repeatable (不重要)

@Repeatable 注解是用于聲明其它類型注解的元注解,來表示這個聲明的注解是可重復(fù)的。@Repeatable的值是另一個注解,其可以通過這個另一個注解的值來包含這個可重復(fù)的注解。

如何使用

我們先來了解一下注解粗淺的使用。最簡單的,

使用自定義注解就是分為三步:定義注解、使用注解、讀取注解。


摘自:https://www.zhihu.com/question/47449512/answer/658228092

我們只要牢牢地把握住這三步,就能掌握注解的使用。

定義注解

因為,注解的基本作用是根據(jù)注解中的值,判斷該如何執(zhí)行被注解代碼塊。所以,在定義注解時,除了要根據(jù)功能加元注解外,還要根據(jù)業(yè)務(wù)意義,編寫合適的方法名稱。

比如,如果我們要編寫一個鎖注解:

  1. @Documented 
  2. @Retention(RUNTIME) 
  3. @Target({TYPE, METHOD}) 
  4. public @interface Lock { 
  5.     //輸鎖名稱 
  6.     String lockName(); 
  7.     //被鎖值 
  8.     String key(); 
  9.     //鎖級別 
  10.     int level(); 
  11.     //異常 
  12.     String exception() default ""

 在一個注解中,能夠返回的類型有:基本數(shù)據(jù)類型、String、enum、Class、其他注解以及前幾者的一維數(shù)組。

注意: 如果沒有 default,那么使用時就必須要入?yún)ⅰ?/p>

使用注解

注解在該注解的地方,入?yún)⒈厝雲(yún)⒌膮?shù)。

Tips:如果注解中只有一個函數(shù),雖然使用時候不需要加函數(shù)名稱就可以直接入?yún)?,但個人建議對于自定義注解,在入?yún)r,還是將函數(shù)名稱寫全,增強代碼可讀性。

讀取注解

我們先想一想,如果是我們自己實現(xiàn)一個注解讀取的方法,我們該怎么來實現(xiàn)呢?

目前我想到的無非就是兩個:

1. 在字符串或字節(jié)碼文件中找注解:這個判斷可不好寫啊,而且復(fù)雜字符串處理不了。

2. 通過反射獲得類、方法、成員變量上的注解。

明眼人就能看出來 2 比 1 靠譜多了,而且還容易實現(xiàn)。

最簡單的一種讀取方式:

  1. public static void main(String[] args) throws NoSuchMethodException { 
  2.      Class<Module> modelClazz = Module.class; 
  3.      Method method = modelClazz.getMethod("lock"null); 
  4.      Lock annotationLock = method.getAnnotation(Lock.class); 
  5.      //獲取注解在 lock 方法上的 value 
  6.      String lockName = annotationLock.lockName(); 
  7.  } 

 這也是框架注解的基本實現(xiàn)原理,因為要獲取注解的具體代碼塊,所以一般需要掃描包。

對于切面編程,引入依賴 aspectj 后,那我們就有了更簡單的調(diào)用方法:

  1. //切面代碼節(jié)選 
  2.    public Object around(ProceedingJoinPoint pjp) throws Throwable { 
  3.        MethodSignature signature = (MethodSignature) pjp.getSignature(); 
  4.        Lock lock = signature.getMethod().getAnnotation(Lock.class); 
  5.        lock.lockName(); 
  6.    } 

 具體關(guān)于切面編程與 joinpoint 的知識,可以參考:

https://blog.csdn.net/qq_15037231/article/details/80624064

注解的作用

至此我們可以總結(jié)出注解的作用。

* 編程提示

保留策略為源碼的注解,一般為提示性注解,比如 @deprecated。

* 用于切面,減少重復(fù)代碼

保留策略為運行的注解,0入侵改變函數(shù)的運行效果,一般用于重復(fù)性功能,比如日志輸出、數(shù)據(jù)格式校驗等。

* 簡化配置信息,項目結(jié)構(gòu)

主要是對于 springboot 這個框架的作用。因為注解可以取值,所以在設(shè)置默認配置信息的同時,也支持輸入配置信息。

* 格式校驗

一般為代碼的語法檢驗,存在與 jdk 的注解包中,比如 @Override。

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2011-07-19 09:38:41

一維數(shù)組Junit靜態(tài)成員

2017-05-12 15:47:15

Spring BootMybatis Ann Web

2009-06-11 10:00:05

Java Socket

2013-04-01 09:39:06

JavaJava異常

2021-04-13 08:25:12

測試開發(fā)Java注解Spring

2009-06-15 16:05:30

設(shè)計AnnotatioJava

2009-09-22 11:30:57

2020-09-11 09:10:18

編程程序員開發(fā)

2013-07-16 10:12:14

iOS多線程多線程概念多線程入門

2024-08-26 08:27:18

2018-09-12 11:18:56

finalJava用法

2013-05-28 09:47:36

異常處理Javay異常

2020-11-20 07:58:04

Java

2013-04-18 09:29:02

編程語言編程

2010-06-23 16:05:36

Linux Bash

2021-12-30 12:30:01

Java注解編譯器

2011-08-09 14:24:18

iPhone多線程線程

2011-05-03 13:13:52

編程PHPJava

2011-08-15 15:56:29

Cocoa編程模塊

2009-09-22 17:32:38

Hibernate A
點贊
收藏

51CTO技術(shù)棧公眾號