您好,登錄后才能下訂單哦!
本文主要介紹Java中與注解和動(dòng)態(tài)代理有關(guān)的部分知識(shí),接下來(lái)我們看看具體內(nèi)容。
Annotation(注解)
其實(shí)就是代碼里的特殊標(biāo)記, 它用于替代配置文件,也就是說(shuō),傳統(tǒng)方式通過(guò)配置文件告訴類如何運(yùn)行,有了注解技術(shù)后,開發(fā)人員可以通過(guò)注解告訴類如何運(yùn)行。
1、 三個(gè)基本的Annotation:
Override:限定重寫父類方法, 該注解只能用于方法
Deprecated:用于表示某個(gè)程序元素(類, 方法等)已過(guò)時(shí)
SuppressWarnings:抑制編譯器警告.
2、自定義Annotation 使用@interface 關(guān)鍵字
配置文件的信息,在注解中采用屬性描述
例:
String name();
帶默認(rèn)值的方式:String name() default “xxx”
注解屬性的類型只能是如下類型:
String類型,8大基本數(shù)據(jù)類型,Class類型,枚舉類型,注解類型,以上類型的一維數(shù)組
特殊屬性value:如果注解中有一個(gè)名稱value的屬性,那么使用注解時(shí)可以省略value=部分,如@MyAnnotation(“xxx")
特殊屬性value[];
3、元Annotation指修飾Annotation的Annotation。
JDK中定義了如下元Annotation:
Retention: 只能用于修飾一個(gè)Annotation 定義, 用于指定該Annotation 可以保留的域, @Rentention 包含一個(gè)RetentionPolicy 類型的成員變量, 通過(guò)這個(gè)變量指定域。
RetentionPolicy.CLASS:編譯器將把注解記錄在 class 文件中. 當(dāng)運(yùn)行 Java 程序時(shí), JVM 不會(huì)保留注解. 這是默認(rèn)值
RetentionPolicy.RUNTIME:編譯器將把注釋記錄在 class 文件中. 當(dāng)運(yùn)行 Java 程序時(shí), JVM 會(huì)保留注解. 程序可以通過(guò)反射獲取該注釋(所以自定義一個(gè)注解時(shí),一般都要加這個(gè)元注解)
RetentionPolicy.SOURCE:編譯器直接丟棄這種策略的注釋
4、@Target:指定注解用于修飾類的哪個(gè)成員。@Target 包含了一個(gè)名為value,類型為ElementType的成員變量。
@Documented: 用于指定被該元Annotation 修飾的Annotation 類將被javadoc 工具提取成文檔.
@Inherited: 被它修飾的Annotation 將具有繼承性.如果某個(gè)類使用了被@Inherited 修飾的Annotation, 則其子類將自動(dòng)具有該注解
動(dòng)態(tài)代理
Java提供了一個(gè)Proxy類,調(diào)用它的newInstance方法可以生成某個(gè)對(duì)象的代理對(duì)象,使用該方法生成代理對(duì)象時(shí),需要三個(gè)參數(shù):
1.生成代理對(duì)象使用哪個(gè)類裝載器
2.生成哪個(gè)對(duì)象的代理對(duì)象,通過(guò)接口指定
3.生成的代理對(duì)象的方法里干什么事,由開發(fā)人員編寫handler接口的實(shí)現(xiàn)來(lái)指定。
初學(xué)者必須理解,或不理解必須記住的2件事情:
Proxy類負(fù)責(zé)創(chuàng)建代理對(duì)象時(shí),如果指定了handler(處理器),那么不管用戶調(diào)用代理對(duì)象的什么方法,該方法都是調(diào)用處理器的invoke方法。
由于invoke方法被調(diào)用需要三個(gè)參數(shù):代理對(duì)象、方法、方法的參數(shù),因此不管代理對(duì)象哪個(gè)方法調(diào)用處理器的invoke方法,都必須把自己所在的對(duì)象、自己(調(diào)用invoke方法的方法)、方法的參數(shù)傳遞進(jìn)來(lái)。
在動(dòng)態(tài)代理技術(shù)里,由于不管用戶調(diào)用代理對(duì)象的什么方法,都是調(diào)用開發(fā)人員編寫的處理器的invoke方法(這相當(dāng)于invoke方法攔截到了代理對(duì)象的方法調(diào)用)。
并且,開發(fā)人員通過(guò)invoke方法的參數(shù),還可以在攔截的同時(shí),知道用戶調(diào)用的是什么方法,因此利用這兩個(gè)特性,就可以實(shí)現(xiàn)一些特殊需求,例如:攔截用戶的訪問(wèn)請(qǐng)求,以檢查用戶是否有訪問(wèn)權(quán)限、動(dòng)態(tài)為某個(gè)對(duì)象添加額外的功能。
總結(jié)
以上就是本文關(guān)于Java注解和動(dòng)態(tài)代理相關(guān)知識(shí)的全部?jī)?nèi)容,希望對(duì)大家Java程序設(shè)計(jì)有所幫助。更多Java內(nèi)容,感興趣的朋友可以閱讀:關(guān)于Java反射機(jī)制 你需要知道的事情、ibatis學(xué)習(xí)之搭建Java項(xiàng)目、Java編程思想對(duì)象的容納實(shí)例詳解等。
感謝大家對(duì)本站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。