關於獲取類的字段有兩種方式:getFields()和getDeclaredFields()。我們先來看看這兩者的區別吧:
getFields():獲得某個類的所有的公共(public)的字段,包括父類中的字段。
getDeclaredFields():獲得某個類的所有聲明的字段,即包括public、private和proteced,但是不包括父類的申明字段。
同樣類似的還有getConstructors()和getDeclaredConstructors()、getMethods()和getDeclaredMethods(),這兩者分別表示獲取某個類的方法、構造函數。
具體編碼如下:
我們先創建一個POJO
- public class User {
- private long id;
- private String name;
- public void setId(long id) {
- this.id = id;
- }
- public void setName(String name) {
- this.name = name;
- }
- public long getId() {
- return id;
- }
- public String getName() {
- return name;
- }
- }
再來獲取此類中的所有字段
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類
- public class Bean {
- private String[] love;
- public String[] getLove() {
- return love;
- }
- public void setLove(String[] love) {
- this.love = love;
- }
- }
創建一個操作類
- import java.lang.reflect.Method;
- public class Admin {
- public static void 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 + "_");