java反射獲得注釋_Java反射與注解(一)基礎(chǔ)知識(shí)

https://www.bilibili.com/video/BV1oy4y1H7R6?from=search&seid=238521864387535270&spm_id_from=333.337.0.0

一、反射(Reflect)描述

JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法。對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性,這是由Class對(duì)象來(lái)完成的,這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱(chēng)為java語(yǔ)言的反射機(jī)制。我們使用反射,通常是為了獲取以下屬性。

Field 屬性

Method方法

Constructor 方法

1、獲取屬性和方法

1.1、獲取Class類(lèi)

//c引用保存內(nèi)存地址指向堆中的對(duì)象,該對(duì)象代,會(huì)執(zhí)行靜態(tài)語(yǔ)句塊

Class class = Class.forNmae(String className);

//每個(gè)類(lèi)型都有Class屬性,不會(huì)執(zhí)行靜態(tài)語(yǔ)句塊

Class class =ClassName.class;

//返回運(yùn)行時(shí)類(lèi),通過(guò)對(duì)象.cgetClass()獲取

User user=new User();

Class class =user.getClass();

1.2、獲取屬性

//獲取所有被Public修飾的屬性

Field [] fields =class .getFields();

//獲取所有屬性

Field [] fields =class .getDeclaredFiedls();

//獲取修飾符

int i=fields .getModiFields();

String strModfire=Modifire.toString(i);//將Int轉(zhuǎn)化為String

//獲取字段的聲明類(lèi)型

Class type=fis.getType();

String name=type.getName();

//獲取字段名

String name=fs[i].getName();

//獲取特定的屬性

Field field=class .getDeclaredFiedls("name");

//創(chuàng)建新實(shí)例

Object object=class .cnewInatance();

//若屬性為私有,無(wú)法訪問(wèn),可以使用打破私有,但因此打破了封裝性

field.setAccessiable(true);

field.set(object,"賦值");

//獲取值

field.get(object);

1.3、獲取方法

//獲取所有的方法

Method [] ms=class .getDeclaredMethods();

//獲取方法修飾符

int i=ms[i].getModifires();

String modifireName=Modifire.toString(i)

//獲取返回值類(lèi)型

Class returnType=ms[i].getReturnType();

String name=returnType.getSimpleName();

//獲取方法名

String name=ms.getName();

//獲取方法形式參數(shù)列表類(lèi)型

Class[] parmeters=ms.getParmeterTypes();

//獲取某個(gè)特定的方法

//需要方法名+參數(shù)列表,如下獲取methodName方法,傳入方法名,以及形參類(lèi)型

Method m=class .getDeclaredMethod("methodName",String.class,String.class);

Object object =class .newInstance();

Object retValue=m.invoke(object ,"實(shí)參","實(shí)參")

1.4、 獲取父類(lèi)或父接口

//獲取父類(lèi)

Class superClass=class .getSuperclass();

superClass.getName();

//獲取父接口

Class[] ins=class .getInterfaces();

ins[i].getName();

二、注解(Annotation)描述

注解(Annotation),也叫元數(shù)據(jù)。一種代碼級(jí)別的說(shuō)明。它是JDK 1.5及以后版本引入的一個(gè)特性,與類(lèi)、接口、枚舉是在同一個(gè)層次。它可以聲明在包、類(lèi)、字段、方法、局部變量、方法參數(shù)等的前面,用來(lái)對(duì)這些元素進(jìn)行說(shuō)明,注釋。

注解是用于告訴編譯器一些信息讓編譯器能夠?qū)崿F(xiàn)基本的編譯檢查。

1、示例與基本屬性

我們打開(kāi)Android studio,查看我們最常用的Override,我們會(huì)在Activiy的許多方法前見(jiàn)到它,他的源碼如下,我們先不解釋其各個(gè)屬性,我們先學(xué)習(xí)Annotation的基本屬性,相信最后我們就可以理解這段內(nèi)容了。

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.SOURCE)

public @interface Override {undefined

}

在Override上的@Targe和 @Retention我們稱(chēng)之為元注解(meta-annotation),因此我們自定義前需要了解元注解,元注解主要有以下四類(lèi)。

@Target:指Annotation所修飾的對(duì)象范圍,這里列出常用的信息

TYPE:類(lèi)、接口(包括注解類(lèi)型)或枚舉

FIELD:屬性

METHOD:方法

CONSTRUCTOR:構(gòu)造函數(shù)

@Retention:指Annotation生效的時(shí)間

SOURCE:源文件中有效

CLASS:編譯時(shí)有效

RUNTIME:在運(yùn)行時(shí)有效

@Documented(了解即可):是一個(gè)標(biāo)記注解,用于描述其它類(lèi)型的注解應(yīng)該被作為被標(biāo)注的程序成員的公共API,因此可以被例如javadoc此類(lèi)的工具文檔化。

@Inherited(了解即可):也是一個(gè)標(biāo)記注解,@Inherited闡述了某個(gè)被標(biāo)注的類(lèi)型是被繼承的

文章知識(shí)點(diǎn)與官方知識(shí)檔案匹配,可進(jìn)一步學(xué)習(xí)相關(guān)知識(shí)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容