反射的核心是jvm在執行時才動態載入類或呼叫方法/訪問屬性,它不需要事先(寫**的時候或編譯期)知道執行物件是誰。
一、j**a反射框架主要提供以下功能:
1.在執行時判斷任意乙個物件所屬的類;
2.在執行時構造任意乙個類的物件;
3.在執行時判斷任意乙個類所具有的成員變數和方法(通過反射甚至可以呼叫private方法);
4.在執行時呼叫任意乙個物件的方法
二、主要用途 :
1、反射最重要的用途就是開發各種通用框架。
1、獲得class物件
使用class類的forname靜態方法
直接獲取某乙個物件的class
呼叫某個物件的getclass()方法
2、判斷是否為某個類的例項
用instanceof關鍵字來判斷是否為某個類的例項
3、建立例項
使用class物件的newinstance()方法來建立class物件對應類的例項。
先通過class物件獲取指定的constructor物件,再呼叫constructor物件的newinstance()方法來建立例項。
4、獲取方法
getdeclaredmethods()
5、獲取構造器資訊
getdeclaredmethods()
getmethods()
getmethod()
6、獲取類的成員變數(字段)資訊
getfiled: 訪問公有的成員變數
getdeclaredfield:所有已宣告的成員變數。但不能得到其父類的成員變數
getfileds和getdeclaredfields用法
7、呼叫方法
invoke()
8、利用反射建立陣列
array.newinstance()
四、注意:
由於反射會額外消耗一定的系統資源,因此如果不需要動態地建立乙個物件,那麼就不需要用反射。
另外,反射呼叫方法時可以忽略許可權檢查,因此可能會破壞封裝性而導致安全問題。
原文:
C 反射的用途
1.使用 assembly 定義和引導程式集,載入在程式集清單中列出的模組 以及從此程式集中查詢型別並建立該型別的例項。2.使用 module 了解如下的類似資訊 包含模組的程式集以及模組中的類等。您還可以獲取在模組上定義的所有全域性方法或其他特定的非全域性方法。3.使用 constructorin...
堆的實現及用途
大頂堆 每個結點的值都大於或等於其左右孩子結點的值。小頂堆 每個結點的值都小於或等於其左右孩子結點的值。注 本節以小頂堆為例,記堆的大小為n。首先定義乙個堆。class heap void push int x void pop int top int size bool empty 從當前結點開始...
Placement new的用法及用途
什麼是placement new?所謂placement new就是在使用者指定的記憶體位置上構建新的物件,這個構建過程不需要額外分配記憶體,只需要呼叫物件的建構函式即可。舉例來說 class foo foo pfoo new foo pfoo指向的物件的位址你是不能決定的,因為new已經為你做了這...