/* * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ import java.beans.Introspector; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.AbstractCollection; import java.util.AbstractList; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.RandomAccess; /** * @test * @bug 8211147 * @modules java.desktop/com.sun.beans.introspect:open */ public final class MethodOrderException { public static void main(final String[] args) throws Exception { // Public API, fails rarely testPublicAPI(); // Test using internal API, fails always testPrivateAPI(); } private static void testPublicAPI() throws Exception { Introspector.getBeanInfo(X.class); } private static void testPrivateAPI() throws Exception { Class name = Class.forName( "com.sun.beans.introspect.MethodInfo$MethodOrder"); Field instance = name.getDeclaredField("instance"); instance.setAccessible(true); Comparator o = (Comparator) instance.get(name); List methods = List.of(X.class.getDeclaredMethods()); methods.forEach(m1 -> { methods.forEach(m2 -> { if (o.compare(m1, m2) != -o.compare(m2, m1)) { System.err.println("Method1 = "+ m1); System.err.println("Method2 = "+ m2); throw new RuntimeException("Broken contract!"); } }); }); } interface X_1 { AbstractList x_8(); } interface X_2 { Cloneable x_0(); } interface X_3 { Serializable x_1(); } interface X_4 { Object x_7(); } interface X_5 { RandomAccess x_6(); } interface X_6 { RandomAccess x_0(); } interface X_7 { Serializable x_5(); } interface X_8 { Object x_4(); } interface X_9 { RandomAccess x_5(); } interface X_10 { Cloneable x_5(); } interface X_11 { RandomAccess x_9(); } interface X_12 { Cloneable x_9(); } interface X_13 { Iterable x_2(); } interface X_14 { Collection x_7(); } interface X_15 { Serializable x_4(); } interface X_16 { Cloneable x_7(); } interface X_17 { Object x_1(); } interface X_18 { ArrayList x_6(); } interface X_19 { List x_5(); } interface X_20 { Collection x_2(); } interface X_21 { List x_1(); } interface X_22 { List x_3(); } interface X_23 { RandomAccess x_3(); } interface X_24 { RandomAccess x_1(); } interface X_25 { Object x_6(); } interface X_26 { Cloneable x_7(); } interface X_27 { Iterable x_0(); } interface X_28 { Iterable x_1(); } interface X_29 { AbstractList x_7(); } interface X_30 { AbstractList x_1(); } interface X_31 { Cloneable x_9(); } interface X_32 { ArrayList x_6(); } interface X_33 { Cloneable x_2(); } interface X_34 { Iterable x_6(); } interface X_35 { Iterable x_9(); } interface X_36 { AbstractList x_9(); } interface X_37 { Iterable x_7(); } interface X_38 { Iterable x_3(); } interface X_39 { Iterable x_9(); } interface X_40 { AbstractList x_3(); } interface X_41 { List x_0(); } interface X_42 { Iterable x_0(); } interface X_43 { Iterable x_2(); } interface X_44 { ArrayList x_4(); } interface X_45 { AbstractList x_4(); } interface X_46 { Collection x_4(); } interface X_47 { ArrayList x_2(); } interface X_48 { ArrayList x_6(); } interface X_49 { Serializable x_1(); } interface X_50 { Cloneable x_7(); } interface X_51 { Collection x_5(); } interface X_52 { RandomAccess x_5(); } interface X_53 { Collection x_5(); } interface X_54 { RandomAccess x_4(); } interface X_55 { Collection x_0(); } interface X_56 { Collection x_7(); } interface X_57 { Iterable x_9(); } interface X_58 { List x_3(); } interface X_59 { Serializable x_7(); } interface X_60 { AbstractCollection x_6(); } interface X_61 { AbstractList x_9(); } interface X_62 { List x_7(); } interface X_63 { AbstractCollection x_3(); } interface X_64 { RandomAccess x_4(); } interface X_65 { Object x_3(); } interface X_66 { RandomAccess x_6(); } interface X_67 { Cloneable x_6(); } interface X_68 { Cloneable x_3(); } interface X_69 { Collection x_5(); } interface X_70 { AbstractCollection x_0(); } interface X_71 { Object x_8(); } interface X_72 { AbstractCollection x_3(); } interface X_73 { Serializable x_4(); } interface X_74 { AbstractList x_8(); } interface X_75 { ArrayList x_1(); } interface X_76 { List x_5(); } interface X_77 { Object x_0(); } interface X_78 { Collection x_0(); } interface X_79 { ArrayList x_2(); } interface X_80 { ArrayList x_8(); } interface X_81 { Cloneable x_3(); } interface X_82 { Serializable x_1(); } interface X_83 { List x_1(); } interface X_84 { Collection x_5(); } interface X_85 { RandomAccess x_9(); } interface X_86 { AbstractList x_3(); } interface X_87 { Cloneable x_6(); } interface X_88 { Object x_2(); } interface X_89 { ArrayList x_5(); } interface X_90 { Iterable x_1(); } interface X_91 { ArrayList x_4(); } interface X_92 { Iterable x_6(); } interface X_93 { Collection x_7(); } interface X_94 { Iterable x_2(); } interface X_95 { AbstractList x_7(); } interface X_96 { RandomAccess x_2(); } interface X_97 { RandomAccess x_2(); } interface X_98 { List x_6(); } interface X_99 { Object x_4(); } interface X_100 { Collection x_7(); } static class X implements X_1, X_2, X_3, X_4, X_5, X_6, X_7, X_8, X_9, X_10, X_11, X_12, X_13, X_14, X_15, X_16, X_17, X_18, X_19, X_20, X_21, X_22, X_23, X_24, X_25, X_26, X_27, X_28, X_29, X_30, X_31, X_32, X_33, X_34, X_35, X_36, X_37, X_38, X_39, X_40, X_41, X_42, X_43, X_44, X_45, X_46, X_47, X_48, X_49, X_50, X_51, X_52, X_53, X_54, X_55, X_56, X_57, X_58, X_59, X_60, X_61, X_62, X_63, X_64, X_65, X_66, X_67, X_68, X_69, X_70, X_71, X_72, X_73, X_74, X_75, X_76, X_77, X_78, X_79, X_80, X_81, X_82, X_83, X_84, X_85, X_86, X_87, X_88, X_89, X_90, X_91, X_92, X_93, X_94, X_95, X_96, X_97, X_98, X_99, X_100 { public ArrayList x_0() { return null; } public ArrayList x_1() { return null; } public ArrayList x_2() { return null; } public ArrayList x_3() { return null; } public ArrayList x_4() { return null; } public ArrayList x_5() { return null; } public ArrayList x_6() { return null; } public ArrayList x_7() { return null; } public ArrayList x_8() { return null; } public ArrayList x_9() { return null; } } }