有没有办法从声明的顺序中获取java类中的私有字段名称

时间:2014-11-06 06:19:51

标签: java spring reflection

我试图以声明的顺序获取所有私有字段的名称:

for ( PropertyDescriptor propertyDescriptor : org.springframework.beans.BeanUtils.getPropertyDescriptors( Some.class ) )
    {
        System.out.println(propertyDescriptor.getName());
    }

当我尝试获取它们时,它们按字段名称按升序排列。

由于

2 个答案:

答案 0 :(得分:3)

Class.getDeclaredFields()按声明顺序返回字段。只获得私人的:

for (Field field : YourClass.cass.getDeclaredFields())
    if (Modifier.isPrivate(field.getModifiers()))
        System.out.println(field.getName());

请注意,不包含继承的字段,引用javadoc:

  

返回Field对象的数组,这些对象反映由此Class对象表示的类或接口声明的所有字段。这包括公共,受保护,默认(包)访问和私有字段,但排除继承字段

为此,您必须对超类和实现的接口(递归地)执行相同的操作。

警告:

引自javadoc:

  

返回数组中的元素没有排序,也没有任何特定的顺序。

API不要求以任何方式对返回的Field数组进行排序,但在实践中(Oracle实现),它们的顺序与您声明的顺序相同。

答案 1 :(得分:0)

我们无法确定Class.getDeclaredFields()是否保持今天的行为方式。 Oracle可以在任何升级的JDK中随时更改它!

如果订单对您很重要,我会采用字段编辑方式来实现字段编号。

如果你想继续代码中的顺序并且不想继续当前Class.getDeclaredFields()的实现,你必须自己解析java源文件。 Javaparser可能会为你节省很多时间。