1.什么是反射?
反射(Reflection)是Java程序開發(fā)語(yǔ)言的特征之一糟需,它允許運(yùn)行中的Java程序?qū)ψ陨磉M(jìn)行檢查,或者說(shuō)“自審(自使瘸)”洲押,動(dòng)態(tài)獲取類的信息以及動(dòng)態(tài)調(diào)用對(duì)象方法。
- 運(yùn)行時(shí)圆凰,對(duì)于任意一個(gè)類杈帐,能夠獲取該類的所有屬性、方法专钉、構(gòu)造器挑童。
- 運(yùn)行時(shí),對(duì)于任意一個(gè)對(duì)象驶沼,能夠調(diào)用該對(duì)象的任意一個(gè)方法和屬性炮沐。
常見的面試考察點(diǎn)包括 - 如何反射獲取Class對(duì)象
- 如何反射獲取類中的所有字段
- 如何反射獲取類中的所有構(gòu)造方法
- 如何反射獲取類中的所有非構(gòu)造方法
2.類的加載
類的加載指的是將類的 .class文件中二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中,將其放在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi)回怜,然后在堆區(qū)創(chuàng)建一個(gè) java.lang.Class對(duì)象大年,用來(lái)封裝,用來(lái)封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)玉雾。
類的加載.png
3.反射API
反射可以將Java類中的各個(gè)組成部分翔试,映射成一個(gè)個(gè)的不同類型的Java對(duì)象。
- Class類:代表類的定義复旬。
- Field類:代表類的成員變量垦缅。
- Method類:代表類的方法。
- Constructor類:代表類的構(gòu)造方法驹碍。
3.1Class類
Class代表類的實(shí)體壁涎,在運(yùn)行的Java應(yīng)用程序中表示類和接口凡恍。
- 使用Class.forName靜態(tài)方法
Class clz = Class.forName("java.lang.String");
- 使用類型的class()方法
Class clz = String.class;
- 使用對(duì)象的getClass()方法
String str = new String ("Hello");
Class clz = str.getClass();
Class類獲得類中屬性相關(guān)的方法(Field類型對(duì)象)
- getField(String name)
獲得某個(gè)公有的屬性對(duì)象 - getFields()
獲得所有公有的屬性對(duì)象 - getDeclaredField(String name)
獲得某個(gè)屬性對(duì)象 - getDeclaredFields()
獲得所有屬性對(duì)象
Class類獲得類中構(gòu)造器的相關(guān)方法(Constructor類型對(duì)象)
- getConstructor(Class...<?> parameterTypes)
獲得該類中與參數(shù)類型匹配的公有構(gòu)造方法 - getConstructors()
獲得該類的所有公有構(gòu)造方法 - getDeclaredConstructor(Class...<?> parameterTypes)
獲得該類中與參數(shù)類型匹配的構(gòu)造方法 - getDeclaredConstructors( )
獲得該類所有構(gòu)造方法
Class類獲得類中方法相關(guān)的方法(Method類型對(duì)象)
- getMethod(String name, Class...<?> parameterTypes)
獲得該類某個(gè)公有的方法 - getMethods( )
獲得該類所有公有的方法 - getDeclaredMethod(String name, Class...<?> parameterTypes)
獲得該類某個(gè)方法 - getDeclaredMethods( )
獲得該類所有方法
3.2Field類
Field代表類的成員變量(成員變量也稱為類的屬性)
- equals(Object obj)
屬性與obj相等則返回true - get(Object obj)
獲得obj中對(duì)應(yīng)的屬性值 - set(Object obj, Object value)
設(shè)置obj中對(duì)應(yīng)屬性值 - setAccessible(boolean flag)
設(shè)置私有屬性是否可訪問(wèn)
3.3Method類
Method代表類方法。
- invoke(Object obj, Object... args)
傳遞object對(duì)象及參數(shù)調(diào)用該對(duì)象對(duì)應(yīng)的方法 - getModifiers( )
返回方法訪問(wèn)修飾符 - getParameters( )
返回方法參數(shù) - getReturnType( )
返回返回值類型Class - setAccessible(boolean flag)
設(shè)置私有方法是否可訪問(wèn)
3.4Constructor類
Constructor代表類的構(gòu)造方法怔球。
- newInstance(Object... initargs)
根據(jù)傳遞的參數(shù)創(chuàng)建類的對(duì)象 - setAccessible(boolean flag)
設(shè)置私有構(gòu)造方法是否可訪問(wèn)