1 /* 2 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 import java.beans.Introspector; 25 import java.io.Serializable; 26 import java.lang.reflect.Field; 27 import java.lang.reflect.Method; 28 import java.util.AbstractCollection; 29 import java.util.AbstractList; 30 import java.util.ArrayList; 31 import java.util.Collection; 32 import java.util.Comparator; 33 import java.util.List; 34 import java.util.RandomAccess; 35 36 /** 37 * @test 38 * @bug 8211147 39 * @modules java.desktop/com.sun.beans.introspect:open 40 */ 41 public final class MethodOrderException { 42 43 public static void main(final String[] args) throws Exception { 44 // Public API, fails rarely 45 testPublicAPI(); 46 // Test using internal API, fails always 47 testPrivateAPI(); 48 } 49 50 private static void testPublicAPI() throws Exception { 51 Introspector.getBeanInfo(X.class); 52 } 53 54 private static void testPrivateAPI() throws Exception { 55 Class<?> name = Class.forName( 56 "com.sun.beans.introspect.MethodInfo$MethodOrder"); 57 Field instance = name.getDeclaredField("instance"); 58 instance.setAccessible(true); 59 Comparator<Method> o = (Comparator) instance.get(name); 60 List<Method> methods = List.of(X.class.getDeclaredMethods()); 61 methods.forEach(m1 -> { 62 methods.forEach(m2 -> { 63 if (o.compare(m1, m2) != -o.compare(m2, m1)) { 64 System.err.println("Method1 = "+ m1); 65 System.err.println("Method2 = "+ m2); 66 throw new RuntimeException("Broken contract!"); 67 } 68 }); 69 }); 70 } 71 72 interface X_1 { 73 74 AbstractList x_8(); 75 } 76 interface X_2 { 77 78 Cloneable x_0(); 79 } 80 interface X_3 { 81 82 Serializable x_1(); 83 } 84 interface X_4 { 85 86 Object x_7(); 87 } 88 interface X_5 { 89 90 RandomAccess x_6(); 91 } 92 interface X_6 { 93 94 RandomAccess x_0(); 95 } 96 interface X_7 { 97 98 Serializable x_5(); 99 } 100 interface X_8 { 101 102 Object x_4(); 103 } 104 interface X_9 { 105 106 RandomAccess x_5(); 107 } 108 interface X_10 { 109 110 Cloneable x_5(); 111 } 112 interface X_11 { 113 114 RandomAccess x_9(); 115 } 116 interface X_12 { 117 118 Cloneable x_9(); 119 } 120 interface X_13 { 121 122 Iterable x_2(); 123 } 124 interface X_14 { 125 126 Collection x_7(); 127 } 128 interface X_15 { 129 130 Serializable x_4(); 131 } 132 interface X_16 { 133 134 Cloneable x_7(); 135 } 136 interface X_17 { 137 138 Object x_1(); 139 } 140 interface X_18 { 141 142 ArrayList x_6(); 143 } 144 interface X_19 { 145 146 List x_5(); 147 } 148 interface X_20 { 149 150 Collection x_2(); 151 } 152 interface X_21 { 153 154 List x_1(); 155 } 156 interface X_22 { 157 158 List x_3(); 159 } 160 interface X_23 { 161 162 RandomAccess x_3(); 163 } 164 interface X_24 { 165 166 RandomAccess x_1(); 167 } 168 interface X_25 { 169 170 Object x_6(); 171 } 172 interface X_26 { 173 174 Cloneable x_7(); 175 } 176 interface X_27 { 177 178 Iterable x_0(); 179 } 180 interface X_28 { 181 182 Iterable x_1(); 183 } 184 interface X_29 { 185 186 AbstractList x_7(); 187 } 188 interface X_30 { 189 190 AbstractList x_1(); 191 } 192 interface X_31 { 193 194 Cloneable x_9(); 195 } 196 interface X_32 { 197 198 ArrayList x_6(); 199 } 200 interface X_33 { 201 202 Cloneable x_2(); 203 } 204 interface X_34 { 205 206 Iterable x_6(); 207 } 208 interface X_35 { 209 210 Iterable x_9(); 211 } 212 interface X_36 { 213 214 AbstractList x_9(); 215 } 216 interface X_37 { 217 218 Iterable x_7(); 219 } 220 interface X_38 { 221 222 Iterable x_3(); 223 } 224 interface X_39 { 225 226 Iterable x_9(); 227 } 228 interface X_40 { 229 230 AbstractList x_3(); 231 } 232 interface X_41 { 233 234 List x_0(); 235 } 236 interface X_42 { 237 238 Iterable x_0(); 239 } 240 interface X_43 { 241 242 Iterable x_2(); 243 } 244 interface X_44 { 245 246 ArrayList x_4(); 247 } 248 interface X_45 { 249 250 AbstractList x_4(); 251 } 252 interface X_46 { 253 254 Collection x_4(); 255 } 256 interface X_47 { 257 258 ArrayList x_2(); 259 } 260 interface X_48 { 261 262 ArrayList x_6(); 263 } 264 interface X_49 { 265 266 Serializable x_1(); 267 } 268 interface X_50 { 269 270 Cloneable x_7(); 271 } 272 interface X_51 { 273 274 Collection x_5(); 275 } 276 interface X_52 { 277 278 RandomAccess x_5(); 279 } 280 interface X_53 { 281 282 Collection x_5(); 283 } 284 interface X_54 { 285 286 RandomAccess x_4(); 287 } 288 interface X_55 { 289 290 Collection x_0(); 291 } 292 interface X_56 { 293 294 Collection x_7(); 295 } 296 interface X_57 { 297 298 Iterable x_9(); 299 } 300 interface X_58 { 301 302 List x_3(); 303 } 304 interface X_59 { 305 306 Serializable x_7(); 307 } 308 interface X_60 { 309 310 AbstractCollection x_6(); 311 } 312 interface X_61 { 313 314 AbstractList x_9(); 315 } 316 interface X_62 { 317 318 List x_7(); 319 } 320 interface X_63 { 321 322 AbstractCollection x_3(); 323 } 324 interface X_64 { 325 326 RandomAccess x_4(); 327 } 328 interface X_65 { 329 330 Object x_3(); 331 } 332 interface X_66 { 333 334 RandomAccess x_6(); 335 } 336 interface X_67 { 337 338 Cloneable x_6(); 339 } 340 interface X_68 { 341 342 Cloneable x_3(); 343 } 344 interface X_69 { 345 346 Collection x_5(); 347 } 348 interface X_70 { 349 350 AbstractCollection x_0(); 351 } 352 interface X_71 { 353 354 Object x_8(); 355 } 356 interface X_72 { 357 358 AbstractCollection x_3(); 359 } 360 interface X_73 { 361 362 Serializable x_4(); 363 } 364 interface X_74 { 365 366 AbstractList x_8(); 367 } 368 interface X_75 { 369 370 ArrayList x_1(); 371 } 372 interface X_76 { 373 374 List x_5(); 375 } 376 interface X_77 { 377 378 Object x_0(); 379 } 380 interface X_78 { 381 382 Collection x_0(); 383 } 384 interface X_79 { 385 386 ArrayList x_2(); 387 } 388 interface X_80 { 389 390 ArrayList x_8(); 391 } 392 interface X_81 { 393 394 Cloneable x_3(); 395 } 396 interface X_82 { 397 398 Serializable x_1(); 399 } 400 interface X_83 { 401 402 List x_1(); 403 } 404 interface X_84 { 405 406 Collection x_5(); 407 } 408 interface X_85 { 409 410 RandomAccess x_9(); 411 } 412 interface X_86 { 413 414 AbstractList x_3(); 415 } 416 interface X_87 { 417 418 Cloneable x_6(); 419 } 420 interface X_88 { 421 422 Object x_2(); 423 } 424 interface X_89 { 425 426 ArrayList x_5(); 427 } 428 interface X_90 { 429 430 Iterable x_1(); 431 } 432 interface X_91 { 433 434 ArrayList x_4(); 435 } 436 interface X_92 { 437 438 Iterable x_6(); 439 } 440 interface X_93 { 441 442 Collection x_7(); 443 } 444 interface X_94 { 445 446 Iterable x_2(); 447 } 448 interface X_95 { 449 450 AbstractList x_7(); 451 } 452 interface X_96 { 453 454 RandomAccess x_2(); 455 } 456 interface X_97 { 457 458 RandomAccess x_2(); 459 } 460 interface X_98 { 461 462 List x_6(); 463 } 464 interface X_99 { 465 466 Object x_4(); 467 } 468 interface X_100 { 469 470 Collection x_7(); 471 } 472 static class X 473 implements X_1, X_2, X_3, X_4, X_5, X_6, X_7, X_8, X_9, X_10, X_11, 474 X_12, X_13, X_14, X_15, X_16, X_17, X_18, X_19, X_20, 475 X_21, X_22, X_23, X_24, X_25, X_26, X_27, X_28, X_29, 476 X_30, X_31, X_32, X_33, X_34, X_35, X_36, X_37, X_38, 477 X_39, X_40, X_41, X_42, X_43, X_44, X_45, X_46, X_47, 478 X_48, X_49, X_50, X_51, X_52, X_53, X_54, X_55, X_56, 479 X_57, X_58, X_59, X_60, X_61, X_62, X_63, X_64, X_65, 480 X_66, X_67, X_68, X_69, X_70, X_71, X_72, X_73, X_74, 481 X_75, X_76, X_77, X_78, X_79, X_80, X_81, X_82, X_83, 482 X_84, X_85, X_86, X_87, X_88, X_89, X_90, X_91, X_92, 483 X_93, X_94, X_95, X_96, X_97, X_98, X_99, X_100 { 484 485 public ArrayList x_0() { 486 return null; 487 } 488 489 public ArrayList x_1() { 490 return null; 491 } 492 493 public ArrayList x_2() { 494 return null; 495 } 496 497 public ArrayList x_3() { 498 return null; 499 } 500 501 public ArrayList x_4() { 502 return null; 503 } 504 505 public ArrayList x_5() { 506 return null; 507 } 508 509 public ArrayList x_6() { 510 return null; 511 } 512 513 public ArrayList x_7() { 514 return null; 515 } 516 517 public ArrayList x_8() { 518 return null; 519 } 520 521 public ArrayList x_9() { 522 return null; 523 } 524 } 525 }