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