獲取class物件
(1) 使用 class 類的 forname 靜態方法:
class c
= class.
forname
("com.qcby.equals.employee"
);
(2)直接獲取某乙個物件的 class,比如:
class klass
=int
.class
;class classint
= integer.type;
(3)呼叫某個物件的 getclass() 方法,比如:
stringbuilder str =
newstringbuilder
("123");
class klass
= str.
getclass()
;
判斷是否為某個類的例項
一般地,我們用 instanceof 關鍵字來判斷是否為某個類的例項。同時我們也可以借助反射中 class 物件的 isinstance() 方法來判斷是否為某個類的例項,它是乙個 native 方法
public
native
boolean
isinstance
(object obj)
;
建立例項
通過反射來生成物件主要有兩種方式。
(1)使用class物件的newinstance()方法來建立class物件對應類的例項。
class c
= string.
class
;object str = c.
newinstance()
;
(2)先通過class物件獲取指定的constructor物件,再呼叫constructor物件的newinstance()方法來建立例項。這種方法可以用指定的構造器構造類的例項。
//獲取string所對應的class物件
class c
= string.
class
;//獲取string類帶乙個string引數的構造器
constructor constructor = c.
getconstructor
(string.
class);
//根據構造器建立例項
object obj = constructor.
newinstance
("23333");
system.out.
println
(obj)
;
獲取方法
獲取某個class物件的方法集合,主要有以下幾個方法:
getdeclaredmethods 方法返回類或介面宣告的所有方法,包括公共、保護、預設(包)訪問和私有方法,但不包括繼承的方法。
public method[
]getdeclaredmethods()
throws securityexception
getmethods 方法返回某個類的所有公用(public)方法,包括其繼承類的公用方法。
public method[
]getmethods()
throws securityexception
getmethod 方法返回乙個特定的方法,其中第乙個引數為方法名稱,後面的引數為方法的引數對應class的物件。
public method getmethod
(string name, class<
?>..
. parametertypes)
獲取構造器資訊
獲取類構造器的用法與上述獲取方法的用法類似。主要是通過class類的getconstructor方法得到constructor類的乙個例項,而constructor類有乙個newinstance方法可以建立乙個物件例項:
public t newinstance
(object .
.. initargs)
此方法可以根據傳入的引數來呼叫對應的constructor建立物件例項。
獲取類的成員變數(字段)資訊
主要是這幾個方法,在此不再贅述:
getfiled:訪問公有的成員變數
getdeclaredfield:所有已宣告的成員變數,但不能得到其父類的成員變數
getfileds 和 getdeclaredfields 方法用法同上(參照 method)。
這裡也可以設定屬性,通過set方法
field[
] declaredfields = cl.
getdeclaredfields()
;accessibleobject.
setaccessible
(declaredfields,
true);
for(field field : declaredfields)
如果無法執行,新增下面**這是乙個許可權,declaredfields為方法物件,可以是陣列。
accessibleobject.
setaccessible
(declaredfields,
true
);
呼叫方法
當我們從類中獲取了乙個方法後,我們就可以用 invoke() 方法來呼叫這個方法。invoke 方法的原型為:
public object invoke
(object obj, object.
.. args)
throws illegalacces***ception, illegalargumentexception,
invocationtargetexception
解釋:方法物件.invoke(引數列表);
由於反射會額外消耗一定的系統資源,因此如果不需要動態地建立乙個物件,那麼就不需要用反射。
另外,反射呼叫方法時可以忽略許可權檢查,因此可能會破壞封裝性而導致安全問題。
用反射方法獲取乙個類建立動態update語句
sqlresolver 是公司內部的通過傳入實體類獲取字段值的用於輔助編寫sql語句的類 stringuutils是用於字串處理講字串首字母大寫的工具類 通過先將字串轉為字元陣列,然後將陣列的第乙個元素,即字串首字母,進行ascii 碼前 移,ascii 中大寫字母從65開始,小寫 字母從97開始,...
乙個簡易的反射類庫NMSReflector
以前看過一些 是簡單的讀取sqlreader然後賦值給model,我不是不贊同這種做法,只是看到大篇幅的賦值操作真的有點浪費時間和精力,尤其是一些老專案居多。我看到的還好,多的也就60多個欄位且不用其他orm,如果涉及到變更的話,那麼對維護人員來說可能不僅僅是眼力活甚至還是.體力活。另外就是 的操作...
利用反射自己寫的乙個ModelHelper類
開發中 很多人都會使用bll model這種開發,我也是,雖然現在有很多的自動生成工具,能在幾秒內生成cs的模板,但我個人還不是很喜歡,我還是喜歡自己乙個乙個去寫,這樣更能了解自己的 不過手動編寫的時候,最討厭的就是getmodel這類方法了,把datarow的資料轉換成乙個model,實在寫的我頭...