首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

JAVA 反射 获取成员变量的顺序,该如何处理

2013-01-26 
JAVA 反射 获取成员变量的顺序最近用到JAVA中的反射相关,遇到了点问题,请教大侠们一下。有一个类:public cl

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);
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            String getMethodName = "get" + firstLetter + fieldName.substring(1);
            Method getMethod = classType.getMethod(getMethodName, new Class[]{});
            Object value = getMethod.invoke(object, new Object[]{});
            cells[i] = new TableCell(value,  
            width+8*i,   
                      LayoutParams.FILL_PARENT,   


                      TableCell.STRING);  
        }
        table.add(new TableRow(cells));  
}
[解决办法]
android只是使用了java语法,harmony jvm本来是遵守java语言规范与java虚拟机规范的,but,sun以及oracle没让它通过其提供的测试套件。。。。。前面已经是历史问题了,google拿harmony去改造成了Dalvik ,但是,虚拟机本身已经与java没有关系了,自然也不会去遵守jvm与java语言规范了

热点排行