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

JAVA基礎(chǔ)之注解與反射的使用方法和場(chǎng)景

 更新時(shí)間:2021年03月22日 09:46:14   作者:BudingCode  
這篇文章主要給大家介紹了關(guān)于JAVA基礎(chǔ)之注解與反射的使用方法和場(chǎng)景的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

注解

注解定義

Java 注解(Annotation)又稱 Java 標(biāo)注,是 JDK5.0 引入的一種注釋機(jī)制。
Java 語(yǔ)言中的類、方法、變量、參數(shù)和包等都可以被標(biāo)注。和注釋不同,Java 標(biāo)注可以通過(guò)反射獲取標(biāo)注內(nèi)容。在編譯器生成類文件時(shí),標(biāo)注可以被嵌入到字節(jié)碼中。Java 虛擬機(jī)可以保留標(biāo)注內(nèi)容,在運(yùn)行 時(shí)可以獲取到標(biāo)注內(nèi)容 。 當(dāng)然它也支持自定義 Java 標(biāo)注。

注解與注釋的區(qū)別:注解是給機(jī)器看的注釋,而注釋是給程序員看的提示,編譯時(shí)自動(dòng)忽略注釋。

使用場(chǎng)景

編譯格式檢查
反射中解析
生成幫助文檔
跟蹤代碼依賴

內(nèi)置注解 

注解類型 注解意義 補(bǔ)充說(shuō)明
@Override 重寫(xiě) 定義在java.lang.Override
@Deprecated 廢棄 定義在java.lang.Deprecated
@SafeVarargs 忽略任何使用參數(shù)為泛型變量的方法或構(gòu)造函數(shù)調(diào)用產(chǎn)生的警告 Java 7 開(kāi)始支持
@FunctionalInterface 函數(shù)式接口 Java 8 開(kāi)始支持,標(biāo)識(shí)一個(gè)匿名函數(shù)或函數(shù)式接口。
@Repeatable 標(biāo)識(shí)某注解可以在同一個(gè)聲明上使用多次 Java 8 開(kāi)始支持,標(biāo)識(shí)某注解可以在同一個(gè)聲明上使用多次。
@SuppressWarnings 抑制編譯時(shí)的警告信息。 定義在java.lang.SuppressWarnings

*補(bǔ)充: @SuppressWarnings 的三種方法:

  • @SuppressWarnings(“unchecked”) [^ 抑制單類型的警告]
  • @SuppressWarnings(“unchecked”,“rawtypes”) [^ 抑制多類型的警告]
  • @SuppressWarnings(“all”) [^ 抑制所有類型的警告]

元注解

定義:

作用在其他注解的注解

元注解類型:

注解類型 注解意義
@Retention 標(biāo)識(shí)這個(gè)注解怎么保存,是只在代碼中,還是編入class文件中,或者是在運(yùn)行時(shí)可以通過(guò)反射訪問(wèn)。
@Documented 標(biāo)記這些注解是否包含在用戶文檔中 javadoc
@Target 標(biāo)記這個(gè)注解應(yīng)該是哪種 Java 成員
@Inherited 標(biāo)記這個(gè)注解是自動(dòng)繼承的

*Inherited 補(bǔ)充:

  • 子類會(huì)繼承父類使用的注解中被@Inherited修飾的注解
  • 接口繼承關(guān)系中,子接口不會(huì)繼承父接口中的任何注解,不管父接口中使用的注解有沒(méi)有 被@Inherited修飾
  • 類實(shí)現(xiàn)接口時(shí)不會(huì)繼承任何接口中定義的注解

自定義注解框架:

  • Annotation 與 RetentionPolicy 與 ElementType 。
    每 1 個(gè) Annotation 對(duì)象,都會(huì)有唯一的 RetentionPolicy 屬性;至于 ElementType 屬性,則有 1~n個(gè)。
  • ElementType(注解的用途類型)“每 1 個(gè) Annotation” 都與 “1~n 個(gè) ElementType” 關(guān)聯(lián)。當(dāng) Annotation 與某個(gè) ElementType 關(guān)聯(lián) 時(shí),就意味著: Annotation有了某種用途。例如,若一個(gè) Annotation 對(duì)象是 METHOD 類型,則該 Annotation 只能用來(lái)修飾方法。
package java.lang.annotation;
public enum ElementType {

TYPE,				/* 類、接口(包括注釋類型)或枚舉聲明 */

FIELD,	 			/* 字段聲明(包括枚舉常量) */

METHOD,				/* 方法聲明 */

PARAMETER,			/* 參數(shù)聲明 */

CONSTRUCTOR,		/* 構(gòu)造方法聲明 */ 

LOCAL_VARIABLE,		/* 局部變量聲明 */ 

ANNOTATION_TYPE, 	/* 注釋類型聲明 */

PACKAGE				 /* 包聲明 */

}

RetentionPolicy(注解作用域策略)

“每 1 個(gè) Annotation” 都與 “1 個(gè) RetentionPolicy” 關(guān)聯(lián)。

a) 若 Annotation 的類型為 SOURCE,則意味著:Annotation 僅存在于編譯器處理期間,編譯器 處理完之后,該 Annotation 就沒(méi)用了。 例如," @Override" 標(biāo)志就是一個(gè) Annotation。當(dāng)它修 飾一個(gè)方法的時(shí)候,就意味著該方法覆蓋父類的方法;并且在編譯期間會(huì)進(jìn)行語(yǔ)法檢查,編譯器處理完后,"@Override" 就沒(méi)有任何作用了。

b) 若 Annotation 的類型為 CLASS,則意味著:編譯器將 Annotation 存儲(chǔ)于類對(duì)應(yīng)的 .class 文件 中,它是 Annotation 的默認(rèn)行為。

c) 若 Annotation 的類型為 RUNTIME,則意味著:編譯器將 Annotation 存儲(chǔ)于 class 文件中,并 且可由JVM讀入。

package java.lang.annotation;
public enum RetentionPolicy {
	SOURCE, /* Annotation信息僅存在于編譯器處理期間,編譯器處理完之后就沒(méi)有該 Annotation信息了 */
	
	CLASS, /* 編譯器將Annotation存儲(chǔ)于類對(duì)應(yīng)的.class文件中。默認(rèn)行為 */
	
	RUNTIME /* 編譯器將Annotation存儲(chǔ)于class文件中,并且可由JVM讀入 */
}

定義格式

@interface 自定義注解名{}

2.5.3、注意事項(xiàng)

  1. 定義的注解,自動(dòng)繼承了java.lang,annotation.Annotation接口
  2. 注解中的每一個(gè)方法,實(shí)際是聲明的注解配置參數(shù)
    方法的名稱就是 配置參數(shù)的名稱
    方法的返回值類型,就是配置參數(shù)的類型。只能是:基本類型/Class/String/enum
  3. 可以通過(guò)default來(lái)聲明參數(shù)的默認(rèn)值
  4. 如果只有一個(gè)參數(shù)成員,一般參數(shù)名為value
  5. 注解元素必須要有值,我們定義注解元素時(shí),經(jīng)常使用空字符串、0作為默認(rèn)值。

反射

JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,獲取任意一個(gè)類的結(jié)構(gòu) , 創(chuàng)建對(duì)象 , 得到方法,執(zhí)行方法 , 屬性;
這種在運(yùn)行狀態(tài)動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能被稱為java語(yǔ)言的反射機(jī)制。

類加載器

Java類加載器(Java Classloader)是Java運(yùn)行時(shí)環(huán)境(Java Runtime Environment)的一部分,
負(fù)責(zé)動(dòng)態(tài)加載Java類到Java虛擬機(jī)的內(nèi)存空間中。

java默認(rèn)有三種類加載器,BootstrapClassLoader、ExtensionClassLoader、App ClassLoader。

  • BootstrapClassLoader(引導(dǎo)啟動(dòng)類加載器):嵌在JVM內(nèi)核中的加載器,該加載器是用C++語(yǔ)言寫(xiě)的,主要負(fù)載加載JAVA_HOME/lib下的類庫(kù),引導(dǎo)啟動(dòng)類加載器無(wú)法被應(yīng)用程序直接使用。ExtensionClassLoader(擴(kuò)展類加載器):
  • ExtensionClassLoader是用JAVA編寫(xiě),且它的父類加載器是Bootstrap。是由sun.misc.Launcher$ExtClassLoader實(shí)現(xiàn)的,主要加載JAVA_HOME/lib/ext目錄中的類 庫(kù)。它的父加載器是BootstrapClassLoaderApp ClassLoader(應(yīng)用類加載器):
  • App ClassLoader是應(yīng)用程序類加載器,負(fù)責(zé)加載應(yīng)用程序classpath目錄下的所有jar和class文 件。它的父加載器為Ext ClassLoader

類通常是按需加載,即第一次使用該類時(shí)才加載。由于有了類加載器,Java運(yùn)行時(shí)系統(tǒng)不需要知道文件與 文件系統(tǒng)。學(xué)習(xí)類加載器時(shí),掌握J(rèn)ava的委派概念很重要。

雙親委派模型:

如果一個(gè)類加載器收到了一個(gè)類加載請(qǐng)求,它不會(huì)自己去嘗試加載這個(gè)類,而是把這個(gè)請(qǐng)求 轉(zhuǎn)交給父類加載器去完成。每一個(gè)層次的類加載器都是如此。因此所有的類加載請(qǐng)求都應(yīng)該傳遞到最頂層的 啟動(dòng)類加載器中,只有到父類加載器反饋?zhàn)约簾o(wú)法完成這個(gè)加載請(qǐng)求(在它的搜索范圍沒(méi)有找到這個(gè)類) 時(shí),子類加載器才會(huì)嘗試自己去加載。委派的好處就是避免有些類被重復(fù)加載。

加載配置文件

給項(xiàng)目添加resource root目錄

通過(guò)類加載器加載資源文件

默認(rèn)加載的是src路徑下的文件,但是當(dāng)項(xiàng)目存在resource root目錄時(shí),就變?yōu)榱思虞d resource root下的文件了。

反射獲取Class

要想了解一個(gè)類,必須先要獲取到該類的字節(jié)碼文件對(duì)象. 在Java中,每一個(gè)字節(jié)碼文件,被夾在到內(nèi)存后,都存在一個(gè)對(duì)應(yīng)的Class類型的對(duì)象

得到Class

  • 如果在編寫(xiě)代碼時(shí), 知道類的名稱, 且類已經(jīng)存在, 可以通過(guò)
    包名.類名.class 得到一個(gè)類的 類對(duì)象如果擁有類的對(duì)象, 可以通過(guò)
  • Class 對(duì)象.getClass() 得到一個(gè)類的 類對(duì)象如果在編寫(xiě)代碼時(shí), 知道類的名稱 , 可以通過(guò)
  • Class.forName(包名+類名): 得到一個(gè)類的 類對(duì)象

上述的三種方式, 在調(diào)用時(shí), 如果類在內(nèi)存中不存在, 則會(huì)加載到內(nèi)存。如果類已經(jīng)在內(nèi)存中存在, 不會(huì)重復(fù)加載, 而是重復(fù)利用

特殊的類對(duì)象

基本數(shù)據(jù)類型的類對(duì)象:
基本數(shù)據(jù)類型.clss

包裝類.type
基本數(shù)據(jù)類型包裝類對(duì)象:
包裝類.class

反射獲取 Constructor

通過(guò)class對(duì)象 獲取一個(gè)類的構(gòu)造方法

1. 通過(guò)指定的參數(shù)類型, 獲取指定的單個(gè)構(gòu)造方法 getConstructor(參數(shù)類型的class對(duì)象數(shù)組)
例如:
構(gòu)造方法如下: 
Person(String name,int age)

得到這個(gè)構(gòu)造方法的代碼如下:
Constructor c = p.getClass().getConstructor(String.class,int.class);

2. 獲取構(gòu)造方法數(shù)組 
getConstructors();

3. 獲取所有權(quán)限的單個(gè)構(gòu)造方法 
getDeclaredConstructor(參數(shù)類型的class對(duì)象數(shù)組)

4. 獲取所有權(quán)限的構(gòu)造方法數(shù)組 
getDeclaredConstructors();

Constructor 創(chuàng)建對(duì)象

newInstance(Object... para)
	調(diào)用這個(gè)構(gòu)造方法, 把對(duì)應(yīng)的對(duì)象創(chuàng)建出來(lái)
	參數(shù): 是一個(gè)Object類型可變參數(shù), 傳遞的參數(shù)順序 必須匹配構(gòu)造方法中形式參數(shù)列表的順序

setAccessible(boolean flag)
	如果flag為true 則表示忽略訪問(wèn)權(quán)限檢查 !(可以訪問(wèn)任何權(quán)限的方法)

反射獲取 Method

通過(guò)class對(duì)象 獲取一個(gè)類的方法

1. getMethod(String methodName , class.. clss) 
	根據(jù)參數(shù)列表的類型和方法名, 得到一個(gè)方法(public修飾的)

2. getMethods();
	得到一個(gè)類的所有方法 (public修飾的)

3. getDeclaredMethod(String methodName , class.. clss) 
	根據(jù)參數(shù)列表的類型和方法名, 得到一個(gè)方法(除繼承以外所有的:包含私有, 共有, 保護(hù), 默認(rèn))

4. getDeclaredMethods();
	得到一個(gè)類的所有方法 (除繼承以外所有的:包含私有, 共有, 保護(hù), 默認(rèn))

Method 執(zhí)行方法

invoke(Object o,Object... para) :
	調(diào)用方法 ,
	參數(shù)1. 要調(diào)用方法的對(duì)象 
	參數(shù)2. 要傳遞的參數(shù)列表

getName()
	獲取方法的方法名稱

setAccessible(boolean flag)
	如果flag為true 則表示忽略訪問(wèn)權(quán)限檢查 (可以訪問(wèn)任何權(quán)限的方法)

反射獲取 Field

通過(guò)class對(duì)象 獲取一個(gè)類的屬性

1. getDeclaredField(String filedName) 
	根據(jù)屬性的名稱, 獲取一個(gè)屬性對(duì)象 (所有屬性)
2. getDeclaredFields()
	獲取所有屬性
3. getField(String filedName)
	根據(jù)屬性的名稱, 獲取一個(gè)屬性對(duì)象 (public屬性)
4. getFields()
	獲取所有屬性 (public)

Field 屬性的對(duì)象類型

常用方法:
1.. get(Object o); 
	參數(shù): 要獲取屬性的對(duì)象 獲取指定對(duì)象的此屬性值

2. set(Object o , Object value);
	參數(shù)1. 要設(shè)置屬性值的 對(duì)象 
	參數(shù)2. 要設(shè)置的值 設(shè)置指定對(duì)象的屬性的值

3. getName();
	獲取屬性的名稱

4. setAccessible(boolean flag);
	如果flag為true 則表示忽略訪問(wèn)權(quán)限檢查 !(可以訪問(wèn)任何權(quán)限的屬性)

通過(guò)反射獲取注解信息

獲取類/屬性/方法的全部注解對(duì)象

Annotation[] annotations01 = Class/Field/Method.getAnnotations();

for (Annotation annotation : annotations01) {
  System.out.println(annotation);
}

根據(jù)類型獲取類/屬性/方法的注解對(duì)象

注解類型 對(duì)象名 = (注解類型) c.getAnnotation(注解類型.class);

內(nèi)省 Introspector

基于反射 , java所提供的一套應(yīng)用到JavaBean的API

Bean類:
一個(gè)定義在包中的類 ,
擁有無(wú)參構(gòu)造器
所有屬性私有,
所有屬性提供get/set方法
實(shí)現(xiàn)了序列化接口

Java提供了一套java.beans包的api , 對(duì)于反射的操作, 進(jìn)行了封裝

獲取Bean類信息

方法:

BeanInfo getBeanInfo(Class cls) 
通過(guò)傳入的類信息, 得到這個(gè)Bean類的封裝對(duì)象 .

獲取bean類的 get/set方法 數(shù)組

常用的方法:
MethodDescriptor[] getPropertyDescriptors():

MethodDescriptor

常用方法:

1. Method getReadMethod();
	獲取一個(gè)get方法
2. Method getWriteMethod();
	獲取一個(gè)set方法

有可能返回null 注意 需要加判斷

總結(jié)

到此這篇關(guān)于JAVA基礎(chǔ)之注解與反射的使用方法和場(chǎng)景的文章就介紹到這了,更多相關(guān)JAVA注解與反射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Intellij IDEA中.properties文件中文顯示亂碼問(wèn)題的解決

    詳解Intellij IDEA中.properties文件中文顯示亂碼問(wèn)題的解決

    這篇文章主要介紹了詳解Intellij IDEA中.properties文件中文顯示亂碼問(wèn)題的解決,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • java實(shí)現(xiàn)希爾排序算法

    java實(shí)現(xiàn)希爾排序算法

    希爾排序(Shell Sort)是插入排序的一種,是針對(duì)直接插入排序算法的改進(jìn),是將整個(gè)無(wú)序列分割成若干小的子序列分別進(jìn)行插入排序,希爾排序并不穩(wěn)定。該方法又稱縮小增量排序,因DL.Shell于1959年提出而得名。
    2015-04-04
  • 關(guān)于shiro中部分SpringCache失效問(wèn)題的解決方法

    關(guān)于shiro中部分SpringCache失效問(wèn)題的解決方法

    這篇文章主要給大家介紹了關(guān)于shiro中部分SpringCache失效問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Java Email郵件發(fā)送簡(jiǎn)單實(shí)現(xiàn)介紹

    Java Email郵件發(fā)送簡(jiǎn)單實(shí)現(xiàn)介紹

    電子郵件從用戶電腦的郵件軟件,例如Outlook,發(fā)送到郵件服務(wù)器上,可能經(jīng)過(guò)若干個(gè)郵件服務(wù)器的中轉(zhuǎn),最終到達(dá)對(duì)方郵件服務(wù)器上,收件方就可以用軟件接收郵件
    2022-11-11
  • Java中的XML解析技術(shù)詳析

    Java中的XML解析技術(shù)詳析

    XML文檔是一個(gè)文檔樹(shù),從根部開(kāi)始,并擴(kuò)展到樹(shù)的最底部,下面這篇文章主要給大家介紹了關(guān)于Java中XML解析技術(shù)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • 最新評(píng)論