Java 反射:按声明顺序获取字段和方法

2022-09-01 12:13:04

有没有办法使用反射按声明的顺序获取类声明的字段(和方法)?根据文档,、 等 返回的方法和字段的顺序是未定义的。getFields()getDeclaredFields()

使用 Java 反射中建议的注释来指定类似索引的内容是可能的:类字段和方法的顺序是否标准化?

有没有更好的选择,即不必手动指定索引?

现在,在你问我需要什么之前:我们有一个方法,它采用一个相当大的数据结构作为输入,并对其执行冗长的计算。为了创建单元测试,我们制作了一个方法,该方法采用输入对象和输出实例,并创建Java源代码(设置输入,调用计算方法,并在之后断言正确的结果)作为输出。当字段按声明顺序编写时,此代码的可读性要强得多。


答案 1

在 jdk 6 中,反映的字段按其申报顺序存在契约。在早期的jdk中,情况并非如此。显然,已经有足够多的人唠叨了。

虽然javadoc不能保证,但我仍然认为这个订单是理所当然的,而且我认为这个订单也会在未来的jdks中保留。

在你的应用中,就像在大多数应用中一样,对声明顺序的依赖性主要是虚荣的 - 如果订单搞砸了,你的应用不会失败,它只是变得更加丑陋。


答案 2

我有一个孤立的问题,看看

https://github.com/wmacevoy/kiss/blob/master/src/main/java/kiss/util/Reflect.java

和方法

公共静态方法[] getDeclaredMethodsInOrder(Class clazz)

它通过查看类的字节码来获取顺序。如果你只是想使用libray,那就是kiss.util.Reflect.getDeclaredMethodsInOrder(Test.class)