Day 24反射

Day 24

1. 反射

1.1 Java文件和.class文件的關係

Java文件
	Java文件中包含代碼的所有內容
	
.class文件
	.java文件通過javac編譯工具生成對應的.class字節碼文件
		包含
			Class 完整的包名,類名
			Field 成員變量
			Method 成員方法

1.2 程序加載過程和.class文件的關係

在Java文件運行過程中,當前程序需要哪一個類參與代碼執行,那麼就需要加載這個類的.class字節碼文件,該.class字節碼文件時在程序的加載階段,存在於內存的【代碼區】
	
	.class字節碼文件既然加載到內存的【代碼區】
	.class文件中包含對應Java程序的所有內容
	代碼區存在一塊空間 ==> .class ==> Java程序的所有內容

1.3 Java中的萬物皆對象

在Java代碼中,把在內存代碼區保存的.class字節碼內存空間,看做是一個對象,而該對象包含了所有內容

2. 反射必會方法

2.1 Class涉及到的方法

Class Class.forName(String packageNameAndClassName)
    Class類的靜態成員方法,通過完整的包名和類名獲取對應的.class文件的Class對象
    同時也可以作爲.class文件加載方法
    
Class 類名.class;
	獲取對應的Class類對象,通常用於方法的參數類型

Class 類對象.getClass();
    通過類對象獲取對應.class的Class類對象,方法參數,或者說數據類型判斷
        
獲取的Class類對象是同一個對象

2.2 Constructor 構造方法類涉及到的方法

public Constructor[] getConstructors();
	獲取當前Class類對象對應Java文件中所有非私有化構造方法的類對象數組
	
public Constructor[] getDeclaredConstructors();
	獲取當前Class類對象對應Java文件中所有構造方法的類對象數組

public Constructor getCOnstructor(Class... initArgumentTypes)
	根據指定的數據類型,選擇對應的構造方法,這裏可能拋出異常
	只能獲取非私有化構造方法類對象,私有化使用Declared【暴力反射】
	Class : 約束數據類型 int.class String.class
	... : 不定長參數
	
Object newInstance(Object... initArguments);
	通過Constructor對象調用,傳入房錢構造方法所需創建所需創建對象的初始化參數,創建對象

2.3 Method成員方法涉及到的方法

Method[] getMethods();
	獲取類內所有public方法,包括繼承來的
Method[] getDeclaredMethods();
	暴力反射
	獲取全部,但不包括繼承的方法
	
Method getMethod(String methodName, Class...);
	根據指定的方法名和對應的參數類型,獲取對應的public修飾的方法

Method getDeclaredMethod(String methodName, Class... parameterTypes);
	根據指定的方法名和對應的參數類型,獲取對應的成員方法,包括私有化成員方法,但是不包括從父類繼承而來的方法

Object invoke(Object obj, Object... Arguments);
	通過Method類對象調用,執行對應的執行者的方法

2.4 Field成員變量涉及到的方法

Field[] getFields();
	獲取類內所有public修飾的成員變量
Field[] getDeclaredFields();
	獲取類內所有成員變量,包括私有化成員方法

Field getField(String fieldName);
	獲取指定變量名的成員變量對象,要求是public修飾的成員變量

Field getDeclaredField(String fieldName);
	獲取指定變量名的成員變量對象,包括private私有化修飾的成員變量
	
void set(Object obj, Object value);
	設置指定調用者中對應成員變量的數據
	
Object get(Object obj);
	獲取指定調用者中指定成員變量的數據

2.5 給予暴力反射私有化內容的權限操作

setAccessible(boolean flag);
	給予Constructor,Method, Field對象,私有化內容,操作權限設置
true表示可以操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章