Java反射技術——欄位的獲取
關於獲取類的欄位有兩種方式:getFields()和getDeclaredFields()。我們先來看看這兩者的區別吧:
getFields():獲得某個類的所有的公共(public)的欄位,包括父類中的欄位。
getDeclaredFields():獲得某個類的所有宣告的欄位,即包括public、private和proteced,但是不包括父類的申明欄位。
同樣類似的還有getConstructors()和getDeclaredConstructors()、getMethods()和getDeclaredMethods(),這兩者分別表示獲取某個類的方法、建構函式。
具體編碼如下:
我們先建立一個POJO
- publicclass User {
- privatelong id;
- private String name;
- publicvoid setId(long id) {
- this.id = id;
- }
- publicvoid setName(String name) {
- this.name = name;
- }
- publiclong getId() {
- return id;
- }
- public String getName() {
- return
- }
- }
Field[] fields = User.class.getDeclaredFields();
獲取欄位的名稱
String fieldName = field.getName();
獲取欄位的修飾符
int fieldValue = field.getModifiers();//如:private、static、final等
與某個具體的修飾符進行比較
Modifier.isStatic(fieldValue)//看此修飾符是否為靜態(static)
獲取欄位的宣告型別
field.getType();//返回的是一個class
與某個型別進行比較
field.getType() == Timestamp.class
獲取指定物件中此欄位的值
Object fieldObject= field.get(user);//user可以看做是從資料庫中查找出來的物件
如果POJO類中有一個集合型別的欄位,我們該如何獲取欄位中中的值呢?
首先建立一個POJO類
- publicclass Bean {
- private String[] love;
- public String[] getLove() {
- return love;
- }
- publicvoid setLove(String[] love) {
- this.love = love;
- }
- }
- import java.lang.reflect.Method;
- publicclass Admin {
- publicstaticvoid main(String[] args) {
- try {
- // 賦值
- Object obj = Bean.class.newInstance();
- Class paramClass = Class.forName("[Ljava.lang.String;");
- String[] param = { "吃", "喝", "玩", "樂" };
- Method method = Bean.class.getMethod("setLove", paramClass);
- method.invoke(obj, (Object) param);
- // 取值
- Bean bean = (Bean) obj;
- for (int i = 0; i < bean.getLove().length; i++) {
- System.out.println(bean.getLove()[i]);
- }
- System.out.println();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
吃
喝
玩
樂
關於field還有一種情況我們需要注意,就是當欄位修飾符為private時,我們需要加上:
field.setAccessible(true);
判斷方法是:if (!field.isAccessible())
更詳細的解釋請點選
接下來補充一下在Java中使用正則表示式
先建立一個正則表示式物件
Pattern pattern = Pattern.compile("[A-Z][a-z]*");
指定為字串的正則表示式必須首先被編譯為此類的例項
Matcher matcher = pattern.matcher(fieldName);
嘗試查詢與該模式匹配的輸入序列的下一個子序列
boolean isMatcher = matcher.find();
返回由以前匹配操作所匹配的輸入子序列
String str = matcher.group();
實現非終端新增和替換步驟,以'_'連線各個欄位
matcher.appendReplacement(sb, str + "_");