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