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í)