天天看點

Java反射機制(三):調用對象的私有屬性和方法

一、 通過反射調用類中的方法

在正常情況下,得到類的對象後,我們就可以直接調用類中的方法了,如果要想調用的話,則肯定必須清楚地知道要調用的方法是什麼,之後通過class類中的getmethod方法,可得到method對象。

當擷取到method對象後,可以通過該對象來執行方法,但是在方法調用的時候,因為會牽扯到方法中參數的問題,是以通過getmethod()取得的時候,必須設定好參數類型。

我們調用saychina()方法,此方法中沒有任何參數。

執行調用的方法,需通過method的invoke方法來實作:

示例1:(調用無參的方法)

我們在person.java 類中定義了一個無參方法saychina和一個有參數的方法sayhello,接下來,我們調用無參數的方法:

輸出: 作者:沉緣,國籍:china

可以看出,通過上述反射的方式,我們能夠順利的調用person類中的方法。 那思考下,如果我們要調用含有參數的方法sayhello,該如何做呢?

可以想象,如果方法裡存在了參數,則必須設定參數的類型及内容。

輸出: 沉緣,你好!我今年:25歲了!

二、 通過反射調用類中的setter及getter方法

setter和getter方法是通路類屬性的标準方法,如果一個類中的屬性被封裝,則必須通過setter及getter方法設設定和取得,實際上此方法的操作之是以要這樣規定,主要是由于反射機制可以給予支援。

通過反射可以調用setter及getter方法。

三、 通過反射調用屬性

如果假設要操作一個類中的屬性,則也可以通過field完成,而不必麻煩的通過setter和getter。class類中,擷取類中field的方法:

1) 得到類中公共屬性

2)得到本類屬性

而在field類中,提供了擷取屬性内容及設定屬性内容的方法:

1) 擷取屬性内容

2) 設定屬性内容

還有一點需要注意,通路類中的私有屬性時,必須要讓該屬性對外可見:

該方法繼承自field的父類:

java.lang.reflect

隻要把該方法的參數内容設定為true即可。

輸出: 

姓名:沉緣

年齡:25

可見,操作屬性,未必需要setter和getter方法的支援,但是,為了保證程式的安全性,最好還是通過setter和getter方法對屬性進行操作。

四、 通過反射操作數組

反射機制不光能用在類中,也可以應用在任意的引用資料類型上,當然,這就包含了數組,數組使用array類完成。

class類中存在以下一個方法:

array類中得到數組指定下标的内容:

array類中修改内容:

array類中開辟新的數組:

取得數組資訊并修改内容:

輸出:

類型:int

長度:3

第一個内容:1

第一個内容:6

數組修改的過程,實際上就是建立一個新的數組的過程,是以要把舊的數組内容拷貝到新的數組中去。

nt數組的長度是:5

1、2、3、0、0、

-------------------------

java.lang.string數組的長度是:8

chenyuan、wuqing、lengxue、null、null、null、null、null、