上一篇文章我們講了怎麼獲取到類的標識符,比如類的訪問權限、接口標識、static標識,final標識、strictfp標識等,下面我們繼續跟着官方文檔講解一下怎麼獲取類的成員,類成員包括以下三種:成員變量、類方法(實例方法和類方法)、構造器(構造方法)。
獲取方式
爲了更好的描述,我們做個約定個通配符XXXX,如果是成員變量就代表Field,如果是類方法就代表Method,如果是構造器就代表Constructor。
那麼怎麼獲取到這三類成員呢?
獲取單個的成員的方式用: getXXXX()和getDeclaredXXXX();
列舉多個成員的方式用: getXXXXs()和getDeclaredXXXXs();
getXXXX和getDeclared的區別
那麼他們有什麼區別呢?
簡單的來說普通的方式(不帶Declared)獲取類的公共(public)的成員,包括父類,帶有Declared的方式獲取類的所有申明的成員,即包括public、private和protected聲明的成員,不包括父類的申明字段。
那麼就有人疑問那怎麼獲取到父類的成員呢?當然是獲取到父類的Class之後,通父類的Class調用這兩類方法獲取。
普通的方式是比較常用的方式,反射本身就破壞封裝的一種方式,爲了減少這種破壞,我們應該操作public成員即可。
具體的區別如下:
獲取成員變量
Class的API方法 | 是否可以列舉 | 是否能列舉繼承類的成員 | 是否能列舉私有成員 |
---|---|---|---|
getDeclaredField() | 否 | 否 | 是 |
getField() | 否 | 是 | 否 |
getDeclaredFields() | 是 | 否 | 是 |
getFields() | 是 | 否 | 否 |
獲取成員方法
Class的API方法 | 是否可以列舉 | 是否能列舉繼承類的成員 | 是否能列舉私有成員 |
---|---|---|---|
getDeclaredMethod() | 否 | 否 | 是 |
getMethod() | 否 | 是 | 否 |
getDeclaredMethods() | 是 | 否 | 是 |
getMethods() | 是 | 否 | 否 |
獲取構造器
Class的API方法 | 是否可以列舉 | 是否能列舉繼承類的成員 | 是否能列舉私有成員 |
---|---|---|---|
getDeclaredConstructor() | 否 | 否 | 是 |
getConstructor() | 否 | 是 | 否 |
getDeclaredConstructors() | 是 | 否 | 是 |
getConstructors() | 是 | 否 | 否 |
類成員的Class
getXXXX()和getDeclaredXXXX()獲取到的類也就是類成員的Class,對應的Class如下.
成員變量: java.lang.reflect.Field
成員方法: java.lang.reflect.Method
構造器方法: java.lang.reflect.Constructor
後面會分爲三章分別解釋一下對應的用法。