在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())