JAVA中如何注解

這篇文章主要講解了JAVA中如何注解,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、寧都網(wǎng)站維護(hù)、網(wǎng)站推廣。

注解的概念

java注解:

比較官方的說法:

從JDK5開始,Java增加對元數(shù)據(jù)的支持,也就是注解,注解與注釋是有一定區(qū)別的,可以把注解理解為代碼里的特殊標(biāo)記,這些標(biāo)記可以在編譯,類加載,運(yùn)行時(shí)被讀取,并執(zhí)行相應(yīng)的處理。通過注解開發(fā)人員可以在不改變原有代碼和邏輯的情況下在源代碼中嵌入補(bǔ)充信息。

注解,可以看作是對 一個(gè) 類/方法 的一個(gè)擴(kuò)展的模版,每個(gè) 類/方法 按照注解類中的規(guī)則,來為 類/方法 注解不同的參數(shù),在用到的地方可以得到不同的 類/方法 中注解的各種參數(shù)與值。

說說我的理解

注解就是Annotation,相信不少人也和我之前一樣以為和注釋一樣,是一段輔助性的文字,其實(shí)注解不是這樣的。注解與注釋的區(qū)別在于,注解可以實(shí)現(xiàn)程序的某些功能。

注解是不會影響java程序的運(yùn)行,不會干擾程序代碼的運(yùn)行。通俗來講,注解就像一個(gè)標(biāo)簽,初學(xué)者需要知道他就像一個(gè)功能標(biāo)簽,能實(shí)現(xiàn)一些功能就行了!入門了再慢慢深入理解。

看下面的例子你就能更好的理解注解了。

注解的類別

(1)java語言提供的注解

(2)元注解

(3)其他注解

java語言提供的注解

1.Override

學(xué)過java你就知道,你肯定見過這種

@Override
public Object clone() throws CloneNotSupportedException {}

沒錯(cuò),@Override就是一個(gè)java提供的注解。當(dāng)你要重寫父類的方法是需要用到這個(gè)注解。

2.@Deprecated

這個(gè)注解你能看到的時(shí)間比較少,但是你應(yīng)該見過類似的,編譯一個(gè)java程序時(shí),編譯器可能會提示你你使用了一個(gè)過時(shí)的方法(idea會),或者過時(shí)的類,過時(shí)的成員變量。

3.@SuppressWarnings

這個(gè)注解的意思是:阻止編譯器的警告,上一個(gè)注解說到@Deprecated會提示你使用過時(shí)方法等的一個(gè)警告,當(dāng)你使用了這個(gè)注解之后就不會有這種提示了!這個(gè)注解需要一個(gè)參數(shù),參數(shù)都是提前設(shè)計(jì)好了的。
參數(shù)如下

(1)deprecation 使用了過時(shí)的類或方法的警告

(2)unchecked 執(zhí)行了未檢查的轉(zhuǎn)換時(shí)的警告,如使用集合時(shí)未指定泛型

(3)fallthrough :當(dāng)在switch語句使用時(shí)發(fā)生case穿透

(4)path 在類路徑,源文件路徑等中有不存在路徑的警告

(5)serial 當(dāng)在可序列化的類上缺少serialVersionUID定義時(shí)的警告

(6)finally 任何finally子句不能完成時(shí)的警告

(7)all 關(guān)于以上所有情況的警告

元注解

所謂元注解就是注解的注解,雖然說這些注解也是java語言提供的,但是他不同于上面說的哪幾種注解,上面的幾種注解也是由

元注解組成的。他們的源代碼里面包含了元注解。

元注解有哪些呢?

- @Target:注解的作用目標(biāo)
- @Retention:注解的生命周期
- @Documented:注解是否應(yīng)當(dāng)被包含在 JavaDoc 文檔中
- @Inherited:是否允許子類繼承該注解

這4個(gè)值java8之前的元注解,在java8又新增了一個(gè)

@Repeatable 元注解,表示被修飾的注解可以用在同一個(gè)聲明式或者類型加上多個(gè)相同的注解(包含不同的屬性值)

我們詳細(xì)說一下這些注解都是什么意思

1.@Target 注解的作用目標(biāo)

具體的作用目標(biāo)有以下幾個(gè)
- ElementType.TYPE:允許被修飾的注解作用在類、接口和枚舉上
- ElementType.FIELD:允許作用在屬性字段上
- ElementType.METHOD:允許作用在方法上
- ElementType.PARAMETER:允許作用在方法參數(shù)上
- ElementType.CONSTRUCTOR:允許作用在構(gòu)造器上
- ElementType.LOCAL_VARIABLE:允許作用在局部變量上
- ElementType.ANNOTATION_TYPE:允許作用在注解上
- ElementType.PACKAGE:允許作用在包上

以上都是這個(gè)注解的參數(shù)

可能有人會問作用目標(biāo)是什么?就是說我聲明的這個(gè)注解可以用在那個(gè)地方,比如說@Override,是不是只能用在重寫的方法上面。如果你學(xué)了springboot的話,里面的很多注解都是可以使用在類上面也可以使用在方法上面。

2.@Retention 注解的生命周期

什么意思?注解本身是不會影響正常邏輯程序的運(yùn)行的,然后這個(gè)注解的生命周期指的是我聲明的這個(gè)注解會保留到什么階段,具體的參數(shù)如下:

- RetentionPolicy.SOURCE:當(dāng)前注解編譯期可見,不會寫入 class 文件,會被編譯器丟棄
- RetentionPolicy.CLASS:類加載階段丟棄,會寫入 class 文件,會被java虛擬機(jī)丟棄
- RetentionPolicy.RUNTIME:永久保存,可以反射獲取到對應(yīng)的注解

3.@Documented 注解是否應(yīng)當(dāng)被包含在 JavaDoc 文檔中

這個(gè)倒沒有什么好說的,就是標(biāo)注被修飾這個(gè)注解包含在JavaDoc文檔中。

4.@Inherited 是否允許子類繼承該注解

簡單點(diǎn)說,子類繼承父類時(shí),如果父類的注解有@Inherited標(biāo)識的注解,子類繼承過來的時(shí)候也會自動繼承@Inherited標(biāo)識的注解。
但是在接口繼承的時(shí)候,子類不會繼承任何@Inherited標(biāo)識的注解。

5.@Repeatable

在需要對同一種注解多次使用時(shí),往往需要借助@Repeatable。比如說,現(xiàn)在有一篇文章,這篇文章需要添加多個(gè)標(biāo)簽,這些標(biāo)簽就相當(dāng)于注解,但是這個(gè)標(biāo)簽只是內(nèi)容不同,這時(shí)候就需要使用到這個(gè)注解了。

其他注解

所謂的其他注解就是第三方注解,比如說很火的springboot,它提供了很多的注解,可以替代一些配置文件,告訴這個(gè)框架有這個(gè)注解是需要提供哪些功能。比如說@Controller,@RequestMapping,@Service等。

注解用法

講了半天,可能你還是一臉懵逼,你只講概念,怎么用?

下面就來介紹這個(gè)注解怎么用,主要是講解注解的聲明用法。

1.注解聲明

public @interface Entity {

}

這個(gè)和聲明接口很類似,只是在前面多了一個(gè)@
具體怎么用,我們用一個(gè)例子來講解

@Target(ElementType.TYPE)//允許聲明的注解修飾在接口,類,枚舉上面
@Retention(RetentionPolicy.RUNTIME)//代碼運(yùn)行期間一直保存注解,可以通過反射獲取
public @interface Entity {
	//表名,注解的參數(shù),默認(rèn)為空
	public String tableName() default "";
	//中文名稱
	public String cnName() default "";

}

解釋一下注解的參數(shù)聲明

第一個(gè)參數(shù)定義參數(shù)為String類型,設(shè)置default 默認(rèn)值,表示這個(gè)不是必須的,在使用注解的時(shí)候沒有填寫這個(gè)參數(shù)不會報(bào)錯(cuò),他會使用默認(rèn)值。
聲明好注解之后,我們將這些注解運(yùn)用到一個(gè)實(shí)體類上面。

再來一個(gè)聲明的作用在屬性上面的注解。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
 //屬性的名稱
 public String fieldName() default "";
 //屬性的屬性中文名稱
 public String fieldCnName() default "";
 //屬性的類型
 public String Type() default "String";
}

然后我們將這兩個(gè)注解運(yùn)用到實(shí)體類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方法沒有貼上來。
具體的用法就是這樣了。然后我們說說注解與反射的關(guān)系,怎么用反射獲取注解。

通過反射獲取注解

不會反射的請看上一篇文章,8000字為你講懂反射,然后再回來看這篇注解的文章。
上代碼直接

	//獲取Class類
 Class clazz = Student.class;

 //獲取類上面的注解
 Entity entity = (Entity) clazz.getAnnotation(Entity.class);
 System.out.println(entity.cnName()+entity.tableName());

 //獲取所有該類聲明的屬性
 Field fields[] = clazz.getDeclaredFields();

 for (Field field:fields){
 //獲取對應(yīng)屬性上面的注解
 Column column = field.getAnnotation(Column.class);
 System.out.println(column.fieldCnName());
 }

這個(gè)運(yùn)行結(jié)果是

學(xué)生表student
姓名
年齡
性別

很簡單是不是。懂了嗎?懂了的話關(guān)注走一波?精彩美文每天為你推送,喜歡手機(jī)看文章的還可以(wx search 全棧學(xué)習(xí)筆記)!

反射注解一起使用拼寫SQL語句實(shí)戰(zhàn)演練

其實(shí)這一部分你懂反射和注解就會了,通過反射和注解你可以實(shí)現(xiàn)一個(gè)簡單的萬能的增刪改查。貼個(gè)新增的SQL語句代碼吧!

//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 ");
 //獲取類上面的注解
 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();

看完上述內(nèi)容,是不是對JAVA中如何注解有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁題目:JAVA中如何注解
URL網(wǎng)址:http://muchs.cn/article32/gdidsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、企業(yè)建站、面包屑導(dǎo)航、電子商務(wù)、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化