用乙個阿里大佬整理的反射來武裝自己

2021-10-23 07:43:42 字數 3265 閱讀 9480

獲取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,實在寫的我頭...