后端 | Java | 反射
筆記來源:Java入門基礎(chǔ)視頻教程,java零基礎(chǔ)自學(xué)就選黑馬程序員Java入門教程
一、反射(Reflection)
反射:加載類,并允許以編程的方式解剖類中的各種成分(成員變量、方法、構(gòu)造器等)。
獲取類:Class對象
Class c1 = 類名.class;
調(diào)用Class提供的方法:public static Class forName(String package);
Object提供的方法:public Class getClass(); Class c3 = 對象.getClass();
獲取類的構(gòu)造器:Constructor對象
Constructor<?>[] getConstructors():獲取全部構(gòu)造器(只能獲取public修飾的)。
Constructor<?>[] getDeclaredConstructors():獲取全部構(gòu)造器(只要存在就能拿到)。
Constructor<T> getConstructor(Class<?>... parameterTypes):獲取某個構(gòu)造器(只能獲取public修飾的)。
Consructor<T> getDeclaredConstructor(Class<?>... parameterType):獲取某個構(gòu)造器(只要存在就能拿到)。
方法:
T newInstance(Object... initargs):調(diào)用此構(gòu)造器對象表示的構(gòu)造器,并傳入?yún)?shù),完成對象的初始化并返回。
public void setAccessible(boolean flag):設(shè)置為true,表示禁止檢查訪問控制(暴力反射)。
獲取類的成員變量:Field對象
public Field[] getFields():獲取類的全部成員變量(只能獲取public修飾的)。
public Field[] getDeclaredFields():獲取類的全部成員變量(只要存在就能拿到)。
public Field getField(String name):獲取類的某個成員變量(只能獲取public修飾的)。
public Field getDeclaredField(String name):獲取類的某個成員變量(只要存在就能拿到)。
方法:
void set(Object obj, Object value):賦值。
Object get(Object obj):取值。
public void setAccessible(boolean flag):設(shè)置為true,表示禁止檢查訪問控制(暴力反射)。
獲取類的成員方法:Method對象
Method[] getMethods():獲取類的全部成員方法(只能獲取public修飾的)。
Method[] getDeclaredMethods():獲取類的全部成員方法(只要存在就能拿到)。
Method getMethod(String name, Class<?>... parameterTypes):獲取類的某個成員方法(只能獲取public修飾的)。
Method getDeclaredMethod(String name, Class<?>... parameterTypes):獲取類的某個成員方法(只要存在就能拿到)。
方法:
public Object invoke(Object obj, Object... args):觸發(fā)某個對象的方法執(zhí)行。
public void setAccessible(boolean flag):設(shè)置為true,表示禁止檢查訪問控制(暴力反射)。
二、反射的作用、應(yīng)用場景
基本作用:可以得到一個類的全部成分然后操作。
可以破壞封裝性。
最重要的作用:適合做Java的框架,基本上,主流的框架都會基于反射設(shè)計(jì)出一些通用的功能。