Dneska jsem zkoumal, proč nám některé testy pracují správně s Oracle Javou (1.6), ale pod IBM Javičkou padají. A výsledek mého bádání mě ohromil. Člověk by doufal, že alespoň třídy v balíku java.lang budou implementovány obdobně. A prdlajz!
Náš problém má původ v rozdílné implementaci metody Class.getMethods(), která toho občas u IBM vrátí o něco více než u Oraclu. Nejsem si zatím jistý, která implementace odpovídá JLS lépe, ale do dneška jsem předpokládal, že kvůli takovýmto problémům existuje TCK.
Chcete-li si problém vyzkoušet sami, zde je kód:
/**
* This class is a reproducer for different results returned from Oracle and IBM Class.getMethod() call.
*
* @author Josef Cacek
*/
public class GetMethodsProblemReproducer {
// Public methods --------------------------------------------------------
/**
* Main method.
*/
public static void main(String[] args) {
System.out.println("Java: " + System.getProperty("java.version") + " " + System.getProperty("java.vendor"));
System.out.println("Length of array returned by B.class.getMethods() call: " + B.class.getMethods().length);
}
// Embedded classes ------------------------------------------------------
public static class A {
public static void test() {
}
}
public static class B extends A {
public static void test() {
}
}
}
Výsledek pro Oracle Javu:
Java: 1.6.0_31 Sun Microsystems Inc. Length of array returned by B.class.getMethods() call: 10
Výsledek pro IBM Javu:
Java: 1.6.0 IBM Corporation Length of array returned by B.class.getMethods() call: 11
Jak jste jistě již sami správně vydedukovali, problém se vyskytne v případě, že "překrýváme" (nebo správněji skrýváme) veřejnou statickou metodu předka.
Komentáře
S diky a pozdravem Daniel Svoboda. daniel.svoboda@areazkh.cz