日期:2014-05-20  浏览次数:20711 次

JAVA 反射 获取成员变量的顺序
最近用到JAVA中的反射相关,遇到了点问题,请教大侠们一下。
有一个类:
public class CategoryBean {
private int CategoryId;
private String CategoryName;
private int parentId;
public CategoryBean()
{}
public int getCategoryId() {
return CategoryId;
}
public void setCategoryId(int categoryId) {
CategoryId = categoryId;
}
public String getCategoryName() {
return CategoryName;
}
public void setCategoryName(String categoryName) {
CategoryName = categoryName;
}
public int getParentId() {
return parentId;
}
public void setParentId(int parentId) {
this.parentId = parentId;
}

}
在一个测试程序中:public class ReflectTester {
  public Object copy(Object object) throws Exception {
  // 获得对象的类型
  Class<?> classType = object.getClass();
  System.out.println("Class:" + classType.getName());
 
  // 通过默认构造方法创建一个新的对象
  Object objectCopy = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
 
  // 获得对象的所有属性
  Field fields[] = classType.getDeclaredFields();
 
  for (int i = 0; i < fields.length; i++) {
  Field field = fields[i];
 
  String fieldName = field.getName();
  System.out.println("name====="+fieldName);
  String firstLetter = fieldName.substring(0, 1).toUpperCase();
  // 获得和属性对应的getXXX()方法的名字
  String getMethodName = "get" + firstLetter + fieldName.substring(1);
  // 获得和属性对应的setXXX()方法的名字
  String setMethodName = "set" + firstLetter + fieldName.substring(1);
 
  // 获得和属性对应的getXXX()方法
  Method getMethod = classType.getMethod(getMethodName, new Class[]{});
  // 获得和属性对应的setXXX()方法
  Method setMethod = classType.getMethod(setMethodName, new Class[]{field.getType()});
 
  // 调用原对象的getXXX()方法
  Object value = getMethod.invoke(object, new Object[]{});
  System.out.println("value===="+value);
  System.out.println(fieldName + ":" + value);
  // 调用拷贝对象的setXXX()方法
  setMethod.invoke(objectCopy, new Object[]{value});
  }
  return objectCopy;
  }
 
  public static void main(String[] args) throws Exception {
  CategoryBean ctb=new CategoryBean();
  ctb.setCategoryId(1);
  ctb.setCategoryName("ctb111");
  ctb.setParentId(3);
  CategoryBean ctb2=(CategoryBean)new ReflectTester().copy(ctb);
  }
}
打印输出:
Class:CategoryBean
fieldname=CategoryId
fieldname=CategoryName
fieldname=parentId

该程序主要是复制一个CategoryBean 对象,通过打印可以看出通过反射来获取类的成员变量的顺序与类声明的时候的顺序是一样的。


在另一个Android程序中,我用几乎相似的方法,但获取到的成员变量的顺序却与类声明时候的顺序不一样,下面程序取得的成员变量的顺序是:CategoryName--CategoryId--parentId,请高手帮忙解释下原因,谢谢!

public void SetList3(Object object) throws Exception
{
Class<?> classType = object.getClass();
Field fields[] = classType.getDeclaredFields();
TableCell[] cells = new TableCell[ fields.length+1];// 每行的单元数
cells[0] = new TableCell(1,  
  width,  
  LayoutParams.FILL_PARENT,  
  TableCell.STRING);  
for (int i = 1; i < fields.length+1; i++) {
Field field = fields[i-1];
String fieldName = field.getName();
System.out.println("fieldname="+fieldName);