I’m so happy to be developing in Java. It takes away the drudgery of software development, like memory management. And it frees you of worrying about how certain features are implemented on different platforms: Write Once, Run Anywhere!
You do feel the but coming, don’t you?
Well, sometimes I do run into system dependencies. And since I’m no longer used to it, I don’t expect it anymore. Ah well, this happens only once in a very, very little while. Let me tell you about one such event.
public Method getMethods() throws SecurityException
Returns an array containing
Methodobjects reflecting all the public member methods of the class or interface represented by this
Classobject, including those declared by the class or interface and those inherited from superclasses and superinterfaces. Array classes return all the (public) member methods inherited from the
Objectclass. The elements in the array returned are not sorted and are not in any particular order. This method returns an array of length 0 if this
Classobject represents a class or interface that has no public member methods, or if this
Classobject represents a primitive type or void.
The interesting part is in italic. This is one of those sentences that you can easily overlook. I know I did.
What does it mean? Nothing more than that the order is undefined in the spec, and so depends on the system (in this case the particular
JVM implementation) that you use. We use both Windows and GNU/Linux to test our stuff, but on both we have a Sun
JVM. I guess most people will use this one too, since it’s from the makers of Java and it’s free (as in beer and now also as in speech).
IBM. For their AIX platform, they have built a custom
JVM. And you guessed right: that
JVM uses a different order for the methods in the array. Whereas the Sun implementation always gives you methods from the class, then those from it’s base class, etc. the
IBM implementation uses the exact reverse order. My code subtly depended on that order, and so it failed on
BTW, if you want to find out more about which
JVM implementation you are using, just issue
java -version. This is from my machine at home:
java version "1.6.0_06" Java(TM) SE Runtime Environment (build 1.6.0_06-b02) Java HotSpot(TM) Server VM (build 10.0-b22, mixed mode)
The HotSpot part is what gives away that it’s from Sun. This is from our
java version "1.5.0" Java(TM) 2 Runtime Environment, Standard Edition (build pap64dev-20080315 (SR7)) IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 AIX ppc64-64 j9vmap6423-20080315 (JIT enabled) J9VM - 20080314_17962_BHdSMr JIT - 20080130_0718ifx2_r8 GC - 200802_08 JCL - 20080314