一申窘、基本定義
通常情況下編寫(xiě)代碼都是固定的婶希,無(wú)論運(yùn)行多少次執(zhí)行的結(jié)果也是固定的耕腾,在某些特殊場(chǎng)合中編寫(xiě) 代碼時(shí)不確定要?jiǎng)?chuàng)建什么類(lèi)型的對(duì)象见剩,也不確定要調(diào)用什么樣的方法,這些都希望通過(guò)運(yùn)行時(shí)傳遞的參數(shù)來(lái)決定扫俺,該機(jī)制叫做動(dòng)態(tài)編程技術(shù)苍苞,也就是反射機(jī)制。 通俗來(lái)說(shuō)牵舵,反射機(jī)制就是用于動(dòng)態(tài)創(chuàng)建對(duì)象并且動(dòng)態(tài)調(diào)用方法的機(jī)制。 目前主流的框架底層都是采用反射機(jī)制實(shí)現(xiàn)的倦挂。
如:
Person p = new Person(); - 表示聲明Person類(lèi)型的引用指向Person類(lèi)型的對(duì)象 p.show(); - 表示調(diào)用Person類(lèi)中的成員方法show
二畸颅、Class類(lèi)
基本概念
java.lang.Class類(lèi)的實(shí)例可以用于描述Java應(yīng)用程序中的類(lèi)和接口,也就是一種數(shù)據(jù)類(lèi)型方援。 該類(lèi)沒(méi)有公共構(gòu)造方法没炒,該類(lèi)的實(shí)例由Java虛擬機(jī)和類(lèi)加載器自動(dòng)構(gòu)造完成,本質(zhì)上就是加載到內(nèi) 存中的運(yùn)行時(shí)類(lèi)犯戏。
獲取Class對(duì)象的方法(重點(diǎn))
- 使用數(shù)據(jù)類(lèi)型.class的方式可以獲取對(duì)應(yīng)類(lèi)型的Class對(duì)象(掌握)送火。
- 使用Class.forName()的方式來(lái)獲取參數(shù)指定類(lèi)型的Class對(duì)象(掌握)。
- 使用引用/對(duì)象.getClass()的方式可以獲取對(duì)應(yīng)類(lèi)型的Class對(duì)象先匪。
- 使用包裝類(lèi).TYPE的方式可以獲取對(duì)應(yīng)基本數(shù)據(jù)類(lèi)型的Class對(duì)象种吸。
- 使用類(lèi)加載器ClassLoader的方式獲取指定類(lèi)型的Class對(duì)象。
常用的方法
方法聲明 |
功能介紹 |
static Class<?> forName(String className) |
用于獲取參數(shù)指定類(lèi)型對(duì)應(yīng)的Class對(duì)象并返回 |
T newInstance() |
用于創(chuàng)建該Class對(duì)象所表示類(lèi)的新實(shí)例 |
Class類(lèi)的常用方法
方法聲明 |
功能介紹 |
Constructor getConstructor(Class<?>... parameterTypes) |
用于獲取此Class對(duì)象所表示類(lèi)型中參數(shù)指定的 parameterTypes) |
Constructor<?>[] getConstructors() |
用于獲取此Class對(duì)象所表示類(lèi)型中所有的公共 構(gòu)造方法(重要) |
Constructor類(lèi)
java.lang.reflect.Constructor類(lèi)主要用于描述獲取到的構(gòu)造方法信息
Constructor類(lèi)的常用方法
方法聲明 |
功能介紹 |
T newInstance(Object... initargs) |
使用此Constructor對(duì)象描述的構(gòu)造方法來(lái)構(gòu)造Class對(duì)象代表類(lèi) 型的新實(shí)例 |
int getModifiers() |
獲取方法的訪問(wèn)修飾符 |
String getName() |
獲取方法的名稱(chēng) |
Class<?>[] getParameterTypes() |
獲取方法所有參數(shù)的類(lèi)型 |
三呀非、Field類(lèi)
基本概念
java.lang.reflect.Field類(lèi)主要用于描述獲取到的單個(gè)成員變量信息坚俗。
Class類(lèi)的常用方法
方法聲明 |
功能介紹 |
Field getDeclaredField(String name) |
用于獲取此Class對(duì)象所表示類(lèi)中參數(shù)指定的單個(gè)成員變量信息 |
Field[] getDeclaredFields() |
用于獲取此Class對(duì)象所表示類(lèi)中所有成員變量信息 |
getField和getDeclaredField的區(qū)別
getField 只能獲取public的,包括從父類(lèi)繼承來(lái)的字段岸裙。getDeclaredField 可以獲取本類(lèi)所有的字段猖败,包括private的,但是不能獲取繼承來(lái)的字段降允。 (注: 這里只能獲取到private的字段恩闻,但并不能訪問(wèn)該private字段的值,除非加上setAccessible(true))
Field類(lèi)的常用方法
方法聲明 |
功能介紹 |
Object get(Object obj) |
獲取參數(shù)對(duì)象obj中此Field對(duì)象所表示成員變量的數(shù)值(重要)
|
void set(Object obj, Object value) |
將參數(shù)對(duì)象obj中此Field對(duì)象表示成員變量的數(shù)值修改為參數(shù), value的數(shù)值 |
void setAccessible(boolean flag) |
當(dāng)實(shí)參傳遞true時(shí),則反射對(duì)象在使用時(shí)應(yīng)該取消 Java 語(yǔ)言訪 問(wèn)檢查 |
int getModifiers() |
獲取成員變量的訪問(wèn)修飾符 |
Class<?> getType() |
獲取成員變量的數(shù)據(jù)類(lèi)型 |
String getName() |
獲取成員變量的名稱(chēng) |
四剧董、Method類(lèi)
基本概念
java.lang.reflect.Method類(lèi)主要用于描述獲取到的單個(gè)成員方法信息幢尚。
Class類(lèi)的常用方法
方法聲明 |
功能介紹 |
Method getMethod(String name, Class<?>... parameterTypes) |
用于獲取該Class對(duì)象表示類(lèi)中名字為name參數(shù)為 parameterTypes的指定公共成員方法 |
Method[] getMethods() |
用于獲取該Class對(duì)象表示類(lèi)中所有公共成員方法 |
Method類(lèi)的常用方法
方法聲明 |
功能介紹 |
Object invoke(Object obj, Object... args) |
使用對(duì)象obj來(lái)調(diào)用此Method對(duì)象所表示的成員方法,實(shí) 參傳遞args |
int getModifiers() |
獲取方法的訪問(wèn)修飾符 |
Class<?> getReturnType() |
獲取方法的返回值類(lèi)型 |
String getName() |
獲取方法的名稱(chēng) |
Class<?>[] getParameterTypes() |
獲取方法所有參數(shù)的類(lèi)型 |
Class<?>[] getExceptionTypes() |
獲取方法的異常信息 |
獲取其它結(jié)構(gòu)信息
方法聲明 |
功能介紹 |
Package getPackage() |
獲取所在的包信息 |
Class<? super T> getSuperclass() |
獲取繼承的父類(lèi)信息 |
Class<?>[] getInterfaces() |
獲取實(shí)現(xiàn)的所有接口 |
Annotation[] getAnnotations() |
獲取注解信息 |
Type[] getGenericInterfaces() |
獲取泛型信息 |