使用JDK7,反射API已经改变,现在getDeclaredMethods()返回的方法是 不 按照在源文件中声明它们的顺序返回。
现在我的问题是,javac生成的.class文件是否包含方法 以相同的顺序 它们是在源文件中定义的,还是可以按随机顺序编写方法?
使用JDK7,反射API已经改变,现在getDeclaredMethods()返回的方法是 不 按照在源文件中声明它们的顺序返回。
现在我的问题是,javac生成的.class文件是否包含方法 以相同的顺序 它们是在源文件中定义的,还是可以按随机顺序编写方法?
该 Java语言规范的二进制兼容性章节 明确表示允许对类文件中的元素进行重新排序:
[...]这里列出了Java编程语言支持的一些重要的二进制兼容更改:
[...]
重新排序现有类型声明中的字段,方法或构造函数。
[...]
重新排序类或接口的直接超接口列表。
这意味着它们出现在.class文件中的顺序不是由规范决定的。如果你想依赖它,你必须要么(1)知道你的具体实现使用与定义顺序相同的顺序(测试它,就像你做的那样,是一个好主意,但不能保证任何东西) ),或(2)自己更改订单。
Class.getDeclaredMethods API很清楚这个“...返回的数组中的元素没有排序,并且没有按任何特定的顺序......”。最有可能的原因是javac没有义务以任何特定顺序在.class中生成方法。