11

在 JDK7 中,反射 API 发生了变化,现在 getDeclaredMethods() 返回的方法不再按照它们在源文件中声明的顺序返回。

现在我的问题是,由 javac 生成的 .class 文件是否包含与在源文件中定义的顺序相同的方法,或者它也可以按随机顺序编写方法?

4

2 回答 2

8

Java 语言规范的Binary Compatibility 一章明确指出允许对类文件中的元素进行重新排序:

[...] 以下是 Java 编程语言支持的一些重要的二进制兼容更改的列表:

  • [...]

  • 重新排序现有类型声明中的字段、方法或构造函数。

  • [...]

  • 重新排序类或接口的直接超接口列表。

这意味着它们出现在 .class 文件中的顺序不受规范的限制。如果你想依赖它,你必须(1)知道你的特定实现使用与定义顺序相同的顺序(测试它,就像你所做的那样,是一个好主意,但不能保证任何事情),或 (2) 自己更改顺序。

于 2012-12-24T09:21:40.820 回答
3

Class.getDeclaredMethods API 对此很清楚“......返回的数组中的元素没有排序,也没有任何特定的顺序......”。最有可能的原因是 javac 没有义务以任何特定的顺序在 .class 中生成方法。

于 2012-12-24T09:28:01.740 回答