Java反射之getFields()、getDeclaredFields()方法
阿新 • • 發佈:2018-12-15
在Java開發中,有兩種獲取欄位的方式:getFields()和getDeclaredFields()。
兩者區別:
getFields():獲取某個類的所有的公共(public)的欄位,包括父類中的欄位
getDeclaredFields():獲取某個類的所有宣告的欄位,即包括public 、private和protected,但是不包括父類中的宣告欄位
類似的方法:
獲取某個類的方法:getMethods()和getDeclaredMethods()
獲取某個類的建構函式:getConstructors()和getDeclaredConstructors()
示例程式碼1如下:
public class User{ private int id; private String name; public void setId(int id){ this.id=id; } public int getId(){ return id; } public void setName(String name){ this.name=name; } public String getName(){ return name; } }
獲取此類中的所有欄位:
Field[] fields=User.class.getDeclaredFields();
獲取欄位的名字:
String fieldName=field[i].getName();
獲取欄位的修飾符:
int fieldValue=field[i].getModifiers();//如:private,public,protected,final,static等
與某個具體的修飾符進行比較:
Modifier.isStatic(fieldValue);//檢視此修飾符是否是靜態類(static)
獲取宣告的欄位型別:
field[i].getType();//返回的是一個class
與某個型別進行比較:
field[i].getType()==TimeStamp.class //TimeStamp.class為任意類名
獲取指定物件中此欄位的值:
Object fieldObject=field[i].get(user);//user可以看做是從資料庫中查找出來的物件
示例程式碼2:
public class Bean{
private String[] funny;
public String[] getFunny(){
return funny;
}
public void setFunny(String[] funny){
this.funny=funny;
}
}
主程式入口:
public static void main(String[] args){
try{
//賦值
Object obj=Bean.class.newInstance();
Class paramClass=Class.forName("java.lang.String");
String[] param={"遊","山","玩","水"};
Method method=Bean.class.getMethod("setFunny",paramClass);
method.invoke(obj,(Object)param);
//取值
Bean bean=(Bean)obj;
for(int i=0;i<bean.getFunny().length;i++){
System.out.println(bean.getFunny()[i]);
}
System.out.println();
}catch (Exception e){
e.printStackTrace();
}
}
}
輸出結果:
遊
山
玩
水
注意:當欄位修飾符為private時,需要加上
field.setAccessible(true);
判斷方法:if(!field.isAccessible())