JAVA注解相關(guān)知識(shí)總結(jié)
注解的概念
java注解:
比較官方的說(shuō)法:
從JDK5開(kāi)始,Java增加對(duì)元數(shù)據(jù)的支持,也就是注解,注解與注釋是有一定區(qū)別的,可以把注解理解為代碼里的特殊標(biāo)記,這些標(biāo)記可以在編譯,類(lèi)加載,運(yùn)行時(shí)被讀取,并執(zhí)行相應(yīng)的處理。通過(guò)注解開(kāi)發(fā)人員可以在不改變?cè)写a和邏輯的情況下在源代碼中嵌入補(bǔ)充信息。
注解,可以看作是對(duì) 一個(gè) 類(lèi)/方法 的一個(gè)擴(kuò)展的模版,每個(gè) 類(lèi)/方法 按照注解類(lèi)中的規(guī)則,來(lái)為 類(lèi)/方法 注解不同的參數(shù),在用到的地方可以得到不同的 類(lèi)/方法 中注解的各種參數(shù)與值。
說(shuō)說(shuō)我的理解
注解就是Annotation,相信不少人也和我之前一樣以為和注釋一樣,是一段輔助性的文字,其實(shí)注解不是這樣的。注解與注釋的區(qū)別在于,注解可以實(shí)現(xiàn)程序的某些功能。
注解是不會(huì)影響java程序的運(yùn)行,不會(huì)干擾程序代碼的運(yùn)行。通俗來(lái)講,注解就像一個(gè)標(biāo)簽,初學(xué)者需要知道他就像一個(gè)功能標(biāo)簽,能實(shí)現(xiàn)一些功能就行了!入門(mén)了再慢慢深入理解。
看下面的例子你就能更好的理解注解了。
注解的類(lèi)別
(1)java語(yǔ)言提供的注解
(2)元注解
(3)其他注解
java語(yǔ)言提供的注解
1.Override
學(xué)過(guò)java你就知道,你肯定見(jiàn)過(guò)這種
@Override public Object clone() throws CloneNotSupportedException {}
沒(méi)錯(cuò),@Override就是一個(gè)java提供的注解。當(dāng)你要重寫(xiě)父類(lèi)的方法是需要用到這個(gè)注解。
2.@Deprecated
這個(gè)注解你能看到的時(shí)間比較少,但是你應(yīng)該見(jiàn)過(guò)類(lèi)似的,編譯一個(gè)java程序時(shí),編譯器可能會(huì)提示你你使用了一個(gè)過(guò)時(shí)的方法(idea會(huì)),或者過(guò)時(shí)的類(lèi),過(guò)時(shí)的成員變量。
3.@SuppressWarnings
這個(gè)注解的意思是:阻止編譯器的警告,上一個(gè)注解說(shuō)到@Deprecated會(huì)提示你使用過(guò)時(shí)方法等的一個(gè)警告,當(dāng)你使用了這個(gè)注解之后就不會(huì)有這種提示了!這個(gè)注解需要一個(gè)參數(shù),參數(shù)都是提前設(shè)計(jì)好了的。
參數(shù)如下
(1)deprecation 使用了過(guò)時(shí)的類(lèi)或方法的警告
(2)unchecked 執(zhí)行了未檢查的轉(zhuǎn)換時(shí)的警告,如使用集合時(shí)未指定泛型
(3)fallthrough :當(dāng)在switch語(yǔ)句使用時(shí)發(fā)生case穿透
(4)path 在類(lèi)路徑,源文件路徑等中有不存在路徑的警告
(5)serial 當(dāng)在可序列化的類(lèi)上缺少serialVersionUID定義時(shí)的警告
(6)finally 任何finally子句不能完成時(shí)的警告
(7)all 關(guān)于以上所有情況的警告
元注解
所謂元注解就是注解的注解,雖然說(shuō)這些注解也是java語(yǔ)言提供的,但是他不同于上面說(shuō)的哪幾種注解,上面的幾種注解也是由
元注解組成的。他們的源代碼里面包含了元注解。
元注解有哪些呢?
- @Target:注解的作用目標(biāo) - @Retention:注解的生命周期 - @Documented:注解是否應(yīng)當(dāng)被包含在 JavaDoc 文檔中 - @Inherited:是否允許子類(lèi)繼承該注解
這4個(gè)值java8之前的元注解,在java8又新增了一個(gè)
@Repeatable 元注解,表示被修飾的注解可以用在同一個(gè)聲明式或者類(lèi)型加上多個(gè)相同的注解(包含不同的屬性值)
我們?cè)敿?xì)說(shuō)一下這些注解都是什么意思
1.@Target 注解的作用目標(biāo)
具體的作用目標(biāo)有以下幾個(gè)
- ElementType.TYPE:允許被修飾的注解作用在類(lèi)、接口和枚舉上
- ElementType.FIELD:允許作用在屬性字段上
- ElementType.METHOD:允許作用在方法上
- ElementType.PARAMETER:允許作用在方法參數(shù)上
- ElementType.CONSTRUCTOR:允許作用在構(gòu)造器上
- ElementType.LOCAL_VARIABLE:允許作用在局部變量上
- ElementType.ANNOTATION_TYPE:允許作用在注解上
- ElementType.PACKAGE:允許作用在包上
以上都是這個(gè)注解的參數(shù)
可能有人會(huì)問(wèn)作用目標(biāo)是什么?就是說(shuō)我聲明的這個(gè)注解可以用在那個(gè)地方,比如說(shuō)@Override,是不是只能用在重寫(xiě)的方法上面。如果你學(xué)了springboot的話,里面的很多注解都是可以使用在類(lèi)上面也可以使用在方法上面。
2.@Retention 注解的生命周期
什么意思?注解本身是不會(huì)影響正常邏輯程序的運(yùn)行的,然后這個(gè)注解的生命周期指的是我聲明的這個(gè)注解會(huì)保留到什么階段,具體的參數(shù)如下:
- RetentionPolicy.SOURCE:當(dāng)前注解編譯期可見(jiàn),不會(huì)寫(xiě)入 class 文件,會(huì)被編譯器丟棄 - RetentionPolicy.CLASS:類(lèi)加載階段丟棄,會(huì)寫(xiě)入 class 文件,會(huì)被java虛擬機(jī)丟棄 - RetentionPolicy.RUNTIME:永久保存,可以反射獲取到對(duì)應(yīng)的注解
3.@Documented 注解是否應(yīng)當(dāng)被包含在 JavaDoc 文檔中
這個(gè)倒沒(méi)有什么好說(shuō)的,就是標(biāo)注被修飾這個(gè)注解包含在JavaDoc文檔中。
4.@Inherited 是否允許子類(lèi)繼承該注解
簡(jiǎn)單點(diǎn)說(shuō),子類(lèi)繼承父類(lèi)時(shí),如果父類(lèi)的注解有@Inherited標(biāo)識(shí)的注解,子類(lèi)繼承過(guò)來(lái)的時(shí)候也會(huì)自動(dòng)繼承@Inherited標(biāo)識(shí)的注解。
但是在接口繼承的時(shí)候,子類(lèi)不會(huì)繼承任何@Inherited標(biāo)識(shí)的注解。
5.@Repeatable
在需要對(duì)同一種注解多次使用時(shí),往往需要借助@Repeatable。比如說(shuō),現(xiàn)在有一篇文章,這篇文章需要添加多個(gè)標(biāo)簽,這些標(biāo)簽就相當(dāng)于注解,但是這個(gè)標(biāo)簽只是內(nèi)容不同,這時(shí)候就需要使用到這個(gè)注解了。
其他注解
所謂的其他注解就是第三方注解,比如說(shuō)很火的springboot,它提供了很多的注解,可以替代一些配置文件,告訴這個(gè)框架有這個(gè)注解是需要提供哪些功能。比如說(shuō)@Controller,@RequestMapping,@Service等。
注解用法
講了半天,可能你還是一臉懵逼,你只講概念,怎么用?
下面就來(lái)介紹這個(gè)注解怎么用,主要是講解注解的聲明用法。
1.注解聲明
public @interface Entity { }
這個(gè)和聲明接口很類(lèi)似,只是在前面多了一個(gè)@
具體怎么用,我們用一個(gè)例子來(lái)講解
@Target(ElementType.TYPE)//允許聲明的注解修飾在接口,類(lèi),枚舉上面 @Retention(RetentionPolicy.RUNTIME)//代碼運(yùn)行期間一直保存注解,可以通過(guò)反射獲取 public @interface Entity { //表名,注解的參數(shù),默認(rèn)為空 public String tableName() default ""; //中文名稱(chēng) public String cnName() default ""; }
解釋一下注解的參數(shù)聲明
第一個(gè)參數(shù)定義參數(shù)為String類(lèi)型,設(shè)置default 默認(rèn)值,表示這個(gè)不是必須的,在使用注解的時(shí)候沒(méi)有填寫(xiě)這個(gè)參數(shù)不會(huì)報(bào)錯(cuò),他會(huì)使用默認(rèn)值。
聲明好注解之后,我們將這些注解運(yùn)用到一個(gè)實(shí)體類(lèi)上面。
再來(lái)一個(gè)聲明的作用在屬性上面的注解。
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { //屬性的名稱(chēng) public String fieldName() default ""; //屬性的屬性中文名稱(chēng) public String fieldCnName() default ""; //屬性的類(lèi)型 public String Type() default "String"; }
然后我們將這兩個(gè)注解運(yùn)用到實(shí)體類(lèi)Student上面。
@Entity(tableName = "student",cnName = "學(xué)生表") public class Student { @Column(fieldCnName = "姓名",fieldName ="name") private String name; @Column(fieldCnName = "年齡",fieldName = "age",Type = "Integer") private Integer age; @Column(fieldCnName = "性別",fieldName = "sex") private String sex; }
set,get方法沒(méi)有貼上來(lái)。
具體的用法就是這樣了。然后我們說(shuō)說(shuō)注解與反射的關(guān)系,怎么用反射獲取注解。
通過(guò)反射獲取注解
不會(huì)反射的請(qǐng)看上一篇文章,8000字為你講懂反射,然后再回來(lái)看這篇注解的文章。
上代碼直接
//獲取Class類(lèi) Class clazz = Student.class; //獲取類(lèi)上面的注解 Entity entity = (Entity) clazz.getAnnotation(Entity.class); System.out.println(entity.cnName()+entity.tableName()); //獲取所有該類(lèi)聲明的屬性 Field fields[] = clazz.getDeclaredFields(); for (Field field:fields){ //獲取對(duì)應(yīng)屬性上面的注解 Column column = field.getAnnotation(Column.class); System.out.println(column.fieldCnName()); }
這個(gè)運(yùn)行結(jié)果是
學(xué)生表student
姓名
年齡
性別
很簡(jiǎn)單是不是。懂了嗎?懂了的話關(guān)注走一波?精彩美文每天為你推送,喜歡手機(jī)看文章的還可以(wx search 全棧學(xué)習(xí)筆記)!
反射注解一起使用拼寫(xiě)SQL語(yǔ)句實(shí)戰(zhàn)演練
其實(shí)這一部分你懂反射和注解就會(huì)了,通過(guò)反射和注解你可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的萬(wàn)能的增刪改查。貼個(gè)新增的SQL語(yǔ)句代碼吧!
//insert into student_test(student_id,student_name,student_sex) values (1,"Jack","男") StringBuilder sql = new StringBuilder(); Class clazz = object.getClass(); sql.append("insert into "); //獲取類(lèi)上面的注解 Entity entity = (Entity) clazz.getAnnotation(Entity.class); sql.append(entity.tableName()); sql.append("("); Field[] fields = clazz.getDeclaredFields(); for(Field field:fields){ sql.append(field.getAnnotation(Column.class).fieldName()).append(","); } sql.deleteCharAt(sql.length()-1); sql.append(")"); sql.append(" values ("); for(Field field:fields){ field.setAccessible(true); Object value = field.get(object); if(value.getClass().equals(String.class)){ sql.append("\"").append(value).append("\"").append(","); }else { sql.append(value).append(","); } } sql.deleteCharAt(sql.length()-1); sql.append(")"); System.out.println(sql.toString()); return sql.toString();
結(jié)語(yǔ):覺(jué)得文章不錯(cuò)的,帶上原文鏈接,歡迎轉(zhuǎn)發(fā),如果你發(fā)現(xiàn)文章中有錯(cuò)誤可以評(píng)論或者私信我,及時(shí)修改?。╳x search 全棧學(xué)習(xí)筆記)精彩美文每天為你推送!
以上就是JAVA注解相關(guān)知識(shí)總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于JAVA注解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Boot實(shí)現(xiàn)異步請(qǐng)求(Servlet 3.0)
在spring 3.2 及以后版本中增加了對(duì)請(qǐng)求的異步處理,這篇文章主要介紹了Spring Boot實(shí)現(xiàn)異步請(qǐng)求(Servlet 3.0),感興趣的小伙伴們可以參考一下。2017-04-04作為Java程序員應(yīng)該掌握的10項(xiàng)技能
這篇文章主要介紹了作為Java程序員應(yīng)該掌握的10項(xiàng)技能,包括java的知識(shí)點(diǎn)與相關(guān)的技能,對(duì)于java的學(xué)習(xí)有不錯(cuò)的參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05Java實(shí)現(xiàn)貪吃蛇大作戰(zhàn)小游戲(附源碼)
今天給大家?guī)?lái)的是小項(xiàng)目是 基于Java+Swing+IO流實(shí)現(xiàn) 的貪吃蛇大作戰(zhàn)小游戲。實(shí)現(xiàn)了界面可視化、基本的吃食物功能、死亡功能、移動(dòng)功能、積分功能,并額外實(shí)現(xiàn)了主動(dòng)加速和鼓勵(lì)機(jī)制,需要的可以參考一下2022-07-07Java實(shí)戰(zhàn)小技巧之?dāng)?shù)組與list互轉(zhuǎn)
在Java中,經(jīng)常遇到需要List與數(shù)組互相轉(zhuǎn)換的場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)戰(zhàn)小技巧之?dāng)?shù)組與list互轉(zhuǎn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08Spring Cloud Gateway 記錄請(qǐng)求應(yīng)答數(shù)據(jù)日志操作
這篇文章主要介紹了Spring Cloud Gateway 記錄請(qǐng)求應(yīng)答數(shù)據(jù)日志操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12idea一招搞定同步所有配置(導(dǎo)入或?qū)С鏊信渲?
使用intellij idea很長(zhǎng)一段時(shí)間,軟件相關(guān)的配置也都按照自己習(xí)慣的設(shè)置好,如果需要重裝軟件,還得需要重新設(shè)置,本文就詳細(xì)的介紹了idea 同步所有配置,感興趣的可以了解一下2021-07-07詳解IDEA 中使用Maven創(chuàng)建項(xiàng)目常見(jiàn)錯(cuò)誤和使用技巧(推薦)
這篇文章主要介紹了詳解IDEA 中使用Maven創(chuàng)建項(xiàng)目常見(jiàn)錯(cuò)誤和使用技巧(推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07SpringBoot+layuimini實(shí)現(xiàn)左側(cè)菜單動(dòng)態(tài)展示的示例代碼
Layuimini是Layui的升級(jí)版,它是專(zhuān)業(yè)做后臺(tái)頁(yè)面的框架,而且是適合PC端和移動(dòng)端,以下地址可以在PC端顯示,也可以在手機(jī)上顯示,只不過(guò)會(huì)做自適應(yīng),本文將給大家介紹了SpringBoot+layuimini實(shí)現(xiàn)左側(cè)菜單動(dòng)態(tài)展示的方法,需要的朋友可以參考下2024-04-04Mybatis執(zhí)行Update返回行數(shù)為負(fù)數(shù)的問(wèn)題
這篇文章主要介紹了Mybatis執(zhí)行Update返回行數(shù)為負(fù)數(shù)的問(wèn)題,具有很好的參考價(jià)值,希望大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12