方法由javac在生成的类文件中排序

时间:2012-12-24 09:01:34

标签: java javac

使用JDK7,反射API已更改,现在getDeclaredMethods()返回的方法按照在源文件中声明的顺序返回。

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

2 个答案:

答案 0 :(得分:8)

Binary Compatibility chapter of the Java Language Specification明确指出允许对类文件中的元素进行重新排序这一事实:

  

[...]这里列出了Java编程语言支持的一些重要的二进制兼容更改:

     
      
  • [...]

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

  •   
  • [...]

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

  •   

这意味着它们出现在.class文件中的顺序不是由规范决定的。如果你想依赖它,你必须要么(1)知道你的具体实现使用与定义顺序相同的顺序(测试它,就像你做的那样,是一个好主意,但不能保证任何东西) ),或(2)自己改变订单。

答案 1 :(得分:3)

Class.getDeclaredMethods API清楚地知道这个“...返回的数组中的元素没有排序,并且没有按任何特定的顺序......”。最有可能的原因是javac没有义务以任何特定的顺序在.class中生成方法。