1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 import java.lang.reflect.*; 18 import java.io.IOException; 19 import java.util.Collections; 20 import java.util.ArrayList; 21 import java.util.Arrays; 22 import java.util.List; 23 import java.util.Map; 24 import java.util.Set; 25 26 /** 27 * Reflection test. 28 */ 29 public class Main { 30 private static boolean FULL_ACCESS_CHECKS = false; // b/5861201 Main()31 public Main() {} Main(ArrayList<Integer> stuff)32 public Main(ArrayList<Integer> stuff) {} 33 printMethodInfo(Method meth)34 void printMethodInfo(Method meth) { 35 Class<?>[] params, exceptions; 36 int i; 37 38 System.out.println("Method name is " + meth.getName()); 39 System.out.println(" Declaring class is " 40 + meth.getDeclaringClass().getName()); 41 params = meth.getParameterTypes(); 42 for (i = 0; i < params.length; i++) 43 System.out.println(" Arg " + i + ": " + params[i].getName()); 44 exceptions = meth.getExceptionTypes(); 45 for (i = 0; i < exceptions.length; i++) 46 System.out.println(" Exc " + i + ": " + exceptions[i].getName()); 47 System.out.println(" Return type is " + meth.getReturnType().getName()); 48 System.out.println(" Access flags are 0x" 49 + Integer.toHexString(meth.getModifiers())); 50 //System.out.println(" GenericStr is " + meth.toGenericString()); 51 } 52 printFieldInfo(Field field)53 void printFieldInfo(Field field) { 54 System.out.println("Field name is " + field.getName()); 55 System.out.println(" Declaring class is " 56 + field.getDeclaringClass().getName()); 57 System.out.println(" Field type is " + field.getType().getName()); 58 System.out.println(" Access flags are 0x" 59 + Integer.toHexString(field.getModifiers())); 60 } 61 showStrings(Target instance)62 private void showStrings(Target instance) 63 throws NoSuchFieldException, IllegalAccessException { 64 65 Class<?> target = Target.class; 66 String one, two, three, four; 67 Field field = null; 68 69 field = target.getField("string1"); 70 one = (String) field.get(instance); 71 72 field = target.getField("string2"); 73 two = (String) field.get(instance); 74 75 field = target.getField("string3"); 76 three = (String) field.get(instance); 77 78 System.out.println(" ::: " + one + ":" + two + ":" + three); 79 } 80 checkAccess()81 public static void checkAccess() { 82 try { 83 Class<?> target = otherpackage.Other.class; 84 Object instance = new otherpackage.Other(); 85 Method meth; 86 87 meth = target.getMethod("publicMethod"); 88 meth.invoke(instance); 89 90 try { 91 meth = target.getMethod("packageMethod"); 92 System.out.println("succeeded on package-scope method"); 93 } catch (NoSuchMethodException nsme) { 94 // good 95 } 96 97 98 instance = otherpackage.Other.getInnerClassInstance(); 99 target = instance.getClass(); 100 meth = target.getMethod("innerMethod"); 101 try { 102 if (!FULL_ACCESS_CHECKS) { throw new IllegalAccessException(); } 103 meth.invoke(instance); 104 System.out.println("inner-method invoke unexpectedly worked"); 105 } catch (IllegalAccessException iae) { 106 // good 107 } 108 109 Field field = target.getField("innerField"); 110 try { 111 int x = field.getInt(instance); 112 if (!FULL_ACCESS_CHECKS) { throw new IllegalAccessException(); } 113 System.out.println("field get unexpectedly worked: " + x); 114 } catch (IllegalAccessException iae) { 115 // good 116 } 117 } catch (Exception ex) { 118 System.out.println("----- unexpected exception -----"); 119 ex.printStackTrace(System.out); 120 } 121 } 122 run()123 public void run() { 124 Class<Target> target = Target.class; 125 Method meth = null; 126 Field field = null; 127 boolean excep; 128 129 try { 130 meth = target.getMethod("myMethod", int.class); 131 132 if (meth.getDeclaringClass() != target) 133 throw new RuntimeException(); 134 printMethodInfo(meth); 135 136 meth = target.getMethod("myMethod", float.class); 137 printMethodInfo(meth); 138 139 meth = target.getMethod("myNoargMethod"); 140 printMethodInfo(meth); 141 142 meth = target.getMethod("myMethod", String[].class, float.class, char.class); 143 printMethodInfo(meth); 144 145 Target instance = new Target(); 146 Object[] argList = new Object[] { 147 new String[] { "hi there" }, 148 new Float(3.1415926f), 149 new Character('\u2714') 150 }; 151 System.out.println("Before, float is " 152 + ((Float)argList[1]).floatValue()); 153 154 Integer boxval; 155 boxval = (Integer) meth.invoke(instance, argList); 156 System.out.println("Result of invoke: " + boxval.intValue()); 157 158 System.out.println("Calling no-arg void-return method"); 159 meth = target.getMethod("myNoargMethod"); 160 meth.invoke(instance, (Object[]) null); 161 162 /* try invoking a method that throws an exception */ 163 meth = target.getMethod("throwingMethod"); 164 try { 165 meth.invoke(instance, (Object[]) null); 166 System.out.println("GLITCH: didn't throw"); 167 } catch (InvocationTargetException ite) { 168 System.out.println("Invoke got expected exception:"); 169 System.out.println(ite.getClass().getName()); 170 System.out.println(ite.getCause()); 171 } 172 catch (Exception ex) { 173 System.out.println("GLITCH: invoke got wrong exception:"); 174 ex.printStackTrace(System.out); 175 } 176 System.out.println(""); 177 178 179 field = target.getField("string1"); 180 if (field.getDeclaringClass() != target) 181 throw new RuntimeException(); 182 printFieldInfo(field); 183 String strVal = (String) field.get(instance); 184 System.out.println(" string1 value is '" + strVal + "'"); 185 186 showStrings(instance); 187 188 field.set(instance, new String("a new string")); 189 strVal = (String) field.get(instance); 190 System.out.println(" string1 value is now '" + strVal + "'"); 191 192 showStrings(instance); 193 194 try { 195 field.set(instance, new Object()); 196 System.out.println("WARNING: able to store Object into String"); 197 } 198 catch (IllegalArgumentException iae) { 199 System.out.println(" got expected illegal obj store exc"); 200 } 201 202 203 try { 204 String four; 205 field = target.getField("string4"); 206 four = (String) field.get(instance); 207 System.out.println("WARNING: able to access string4: " 208 + four); 209 } 210 catch (IllegalAccessException iae) { 211 System.out.println(" got expected access exc"); 212 } 213 catch (NoSuchFieldException nsfe) { 214 System.out.println(" got the other expected access exc"); 215 } 216 try { 217 String three; 218 field = target.getField("string3"); 219 three = (String) field.get(this); 220 System.out.println("WARNING: able to get string3 in wrong obj: " 221 + three); 222 } 223 catch (IllegalArgumentException iae) { 224 System.out.println(" got expected arg exc"); 225 } 226 227 /* 228 * Try setting a field to null. 229 */ 230 String four; 231 field = target.getDeclaredField("string3"); 232 field.set(instance, null); 233 234 /* 235 * Try getDeclaredField on a non-existent field. 236 */ 237 try { 238 field = target.getDeclaredField("nonExistent"); 239 System.out.println("ERROR: Expected NoSuchFieldException"); 240 } catch (NoSuchFieldException nsfe) { 241 String msg = nsfe.getMessage(); 242 if (!msg.contains("Target;")) { 243 System.out.println(" NoSuchFieldException '" + msg + 244 "' didn't contain class"); 245 } 246 } 247 248 /* 249 * Do some stuff with long. 250 */ 251 long longVal; 252 field = target.getField("pubLong"); 253 longVal = field.getLong(instance); 254 System.out.println("pubLong initial value is " + 255 Long.toHexString(longVal)); 256 field.setLong(instance, 0x9988776655443322L); 257 longVal = field.getLong(instance); 258 System.out.println("pubLong new value is " + 259 Long.toHexString(longVal)); 260 261 262 field = target.getField("superInt"); 263 if (field.getDeclaringClass() == target) 264 throw new RuntimeException(); 265 printFieldInfo(field); 266 int intVal = field.getInt(instance); 267 System.out.println(" superInt value is " + intVal); 268 Integer boxedIntVal = (Integer) field.get(instance); 269 System.out.println(" superInt boxed is " + boxedIntVal); 270 271 field.set(instance, new Integer(20202)); 272 intVal = field.getInt(instance); 273 System.out.println(" superInt value is now " + intVal); 274 field.setShort(instance, (short)30303); 275 intVal = field.getInt(instance); 276 System.out.println(" superInt value (from short) is now " +intVal); 277 field.setInt(instance, 40404); 278 intVal = field.getInt(instance); 279 System.out.println(" superInt value is now " + intVal); 280 try { 281 field.set(instance, new Long(123)); 282 System.out.println("FAIL: expected exception not thrown"); 283 } 284 catch (IllegalArgumentException iae) { 285 System.out.println(" got expected long->int failure"); 286 } 287 try { 288 field.setLong(instance, 123); 289 System.out.println("FAIL: expected exception not thrown"); 290 } 291 catch (IllegalArgumentException iae) { 292 System.out.println(" got expected long->int failure"); 293 } 294 try { 295 field.set(instance, new String("abc")); 296 System.out.println("FAIL: expected exception not thrown"); 297 } 298 catch (IllegalArgumentException iae) { 299 System.out.println(" got expected string->int failure"); 300 } 301 302 try { 303 field.getShort(instance); 304 System.out.println("FAIL: expected exception not thrown"); 305 } 306 catch (IllegalArgumentException iae) { 307 System.out.println(" got expected int->short failure"); 308 } 309 310 field = target.getField("superClassInt"); 311 printFieldInfo(field); 312 int superClassIntVal = field.getInt(instance); 313 System.out.println(" superClassInt value is " + superClassIntVal); 314 315 field = target.getField("staticDouble"); 316 printFieldInfo(field); 317 double staticDoubleVal = field.getDouble(null); 318 System.out.println(" staticDoubleVal value is " + staticDoubleVal); 319 320 try { 321 field.getLong(instance); 322 System.out.println("FAIL: expected exception not thrown"); 323 } 324 catch (IllegalArgumentException iae) { 325 System.out.println(" got expected double->long failure"); 326 } 327 328 excep = false; 329 try { 330 field = target.getField("aPrivateInt"); 331 printFieldInfo(field); 332 } 333 catch (NoSuchFieldException nsfe) { 334 System.out.println("as expected: aPrivateInt not found"); 335 excep = true; 336 } 337 if (!excep) 338 System.out.println("BUG: got aPrivateInt"); 339 340 341 field = target.getField("constantString"); 342 printFieldInfo(field); 343 String val = (String) field.get(instance); 344 System.out.println(" Constant test value is " + val); 345 346 347 field = target.getField("cantTouchThis"); 348 printFieldInfo(field); 349 intVal = field.getInt(instance); 350 System.out.println(" cantTouchThis is " + intVal); 351 try { 352 field.setInt(instance, 99); 353 System.out.println("ERROR: set-final did not throw exception"); 354 } catch (IllegalAccessException iae) { 355 System.out.println(" as expected: set-final throws exception"); 356 } 357 intVal = field.getInt(instance); 358 System.out.println(" cantTouchThis is still " + intVal); 359 360 System.out.println(" " + field + " accessible=" + field.isAccessible()); 361 field.setAccessible(true); 362 System.out.println(" " + field + " accessible=" + field.isAccessible()); 363 field.setInt(instance, 87); // exercise int version 364 intVal = field.getInt(instance); 365 System.out.println(" cantTouchThis is now " + intVal); 366 field.set(instance, 88); // exercise Object version 367 intVal = field.getInt(instance); 368 System.out.println(" cantTouchThis is now " + intVal); 369 370 Constructor<Target> cons; 371 Target targ; 372 Object[] args; 373 374 cons = target.getConstructor(int.class, float.class); 375 args = new Object[] { new Integer(7), new Float(3.3333) }; 376 System.out.println("cons modifiers=" + cons.getModifiers()); 377 targ = cons.newInstance(args); 378 targ.myMethod(17); 379 380 try { 381 Thrower thrower = Thrower.class.newInstance(); 382 System.out.println("ERROR: Class.newInstance did not throw exception"); 383 } catch (UnsupportedOperationException uoe) { 384 System.out.println("got expected exception for Class.newInstance"); 385 } catch (Exception e) { 386 System.out.println("ERROR: Class.newInstance got unexpected exception: " + 387 e.getClass().getName()); 388 } 389 390 try { 391 Constructor<Thrower> constructor = Thrower.class.getDeclaredConstructor(); 392 Thrower thrower = constructor.newInstance(); 393 System.out.println("ERROR: Constructor.newInstance did not throw exception"); 394 } catch (InvocationTargetException ite) { 395 System.out.println("got expected exception for Constructor.newInstance"); 396 } catch (Exception e) { 397 System.out.println("ERROR: Constructor.newInstance got unexpected exception: " + 398 e.getClass().getName()); 399 } 400 401 } catch (Exception ex) { 402 System.out.println("----- unexpected exception -----"); 403 ex.printStackTrace(System.out); 404 } 405 406 System.out.println("ReflectTest done!"); 407 } 408 checkSwap()409 public static void checkSwap() { 410 Method m; 411 412 final Object[] objects = new Object[2]; 413 try { 414 m = Collections.class.getDeclaredMethod("swap", 415 Object[].class, int.class, int.class); 416 } catch (NoSuchMethodException nsme) { 417 nsme.printStackTrace(System.out); 418 return; 419 } 420 System.out.println(m + " accessible=" + m.isAccessible()); 421 m.setAccessible(true); 422 System.out.println(m + " accessible=" + m.isAccessible()); 423 try { 424 m.invoke(null, objects, 0, 1); 425 } catch (IllegalAccessException iae) { 426 iae.printStackTrace(System.out); 427 return; 428 } catch (InvocationTargetException ite) { 429 ite.printStackTrace(System.out); 430 return; 431 } 432 433 try { 434 String s = "Should be ignored"; 435 m.invoke(s, objects, 0, 1); 436 } catch (IllegalAccessException iae) { 437 iae.printStackTrace(System.out); 438 return; 439 } catch (InvocationTargetException ite) { 440 ite.printStackTrace(System.out); 441 return; 442 } 443 444 try { 445 System.out.println("checkType invoking null"); 446 // Trigger an NPE at the target. 447 m.invoke(null, null, 0, 1); 448 System.out.println("ERROR: should throw InvocationTargetException"); 449 } catch (InvocationTargetException ite) { 450 System.out.println("checkType got expected exception"); 451 } catch (IllegalAccessException iae) { 452 iae.printStackTrace(System.out); 453 return; 454 } 455 } 456 checkClinitForFields()457 public static void checkClinitForFields() throws Exception { 458 // Loading a class constant shouldn't run <clinit>. 459 System.out.println("calling const-class FieldNoisyInitUser.class"); 460 Class<?> niuClass = FieldNoisyInitUser.class; 461 System.out.println("called const-class FieldNoisyInitUser.class"); 462 463 // Getting the declared fields doesn't run <clinit>. 464 Field[] fields = niuClass.getDeclaredFields(); 465 System.out.println("got fields"); 466 467 Field field = niuClass.getField("staticField"); 468 System.out.println("got field"); 469 field.get(null); 470 System.out.println("read field value"); 471 472 // FieldNoisyInitUser should now be initialized, but FieldNoisyInit shouldn't be initialized yet. 473 FieldNoisyInitUser niu = new FieldNoisyInitUser(); 474 FieldNoisyInit ni = new FieldNoisyInit(); 475 476 System.out.println(""); 477 } 478 checkClinitForMethods()479 public static void checkClinitForMethods() throws Exception { 480 // Loading a class constant shouldn't run <clinit>. 481 System.out.println("calling const-class MethodNoisyInitUser.class"); 482 Class<?> niuClass = MethodNoisyInitUser.class; 483 System.out.println("called const-class MethodNoisyInitUser.class"); 484 485 // Getting the declared methods doesn't run <clinit>. 486 Method[] methods = niuClass.getDeclaredMethods(); 487 System.out.println("got methods"); 488 489 Method method = niuClass.getMethod("staticMethod"); 490 System.out.println("got method"); 491 method.invoke(null); 492 System.out.println("invoked method"); 493 494 // MethodNoisyInitUser should now be initialized, but MethodNoisyInit shouldn't be initialized yet. 495 MethodNoisyInitUser niu = new MethodNoisyInitUser(); 496 MethodNoisyInit ni = new MethodNoisyInit(); 497 498 System.out.println(""); 499 } 500 501 502 /* 503 * Test some generic type stuff. 504 */ 505 public List<String> dummy; fancyMethod(ArrayList<String> blah)506 public Map<Integer,String> fancyMethod(ArrayList<String> blah) { return null; } checkGeneric()507 public static void checkGeneric() { 508 Field field; 509 try { 510 field = Main.class.getField("dummy"); 511 } catch (NoSuchFieldException nsfe) { 512 throw new RuntimeException(nsfe); 513 } 514 Type listType = field.getGenericType(); 515 System.out.println("generic field: " + listType); 516 517 Method method; 518 try { 519 method = Main.class.getMethod("fancyMethod", ArrayList.class); 520 } catch (NoSuchMethodException nsme) { 521 throw new RuntimeException(nsme); 522 } 523 Type[] parmTypes = method.getGenericParameterTypes(); 524 Type ret = method.getGenericReturnType(); 525 System.out.println("generic method " + method.getName() + " params='" 526 + stringifyTypeArray(parmTypes) + "' ret='" + ret + "'"); 527 528 Constructor<?> ctor; 529 try { 530 ctor = Main.class.getConstructor( ArrayList.class); 531 } catch (NoSuchMethodException nsme) { 532 throw new RuntimeException(nsme); 533 } 534 parmTypes = ctor.getGenericParameterTypes(); 535 System.out.println("generic ctor " + ctor.getName() + " params='" 536 + stringifyTypeArray(parmTypes) + "'"); 537 } 538 539 /* 540 * Convert an array of Type into a string. Start with an array count. 541 */ stringifyTypeArray(Type[] types)542 private static String stringifyTypeArray(Type[] types) { 543 StringBuilder stb = new StringBuilder(); 544 boolean first = true; 545 546 stb.append("[" + types.length + "]"); 547 548 for (Type t: types) { 549 if (first) { 550 stb.append(" "); 551 first = false; 552 } else { 553 stb.append(", "); 554 } 555 stb.append(t.toString()); 556 } 557 558 return stb.toString(); 559 } 560 checkUnique()561 public static void checkUnique() { 562 Field field1, field2; 563 try { 564 field1 = Main.class.getField("dummy"); 565 field2 = Main.class.getField("dummy"); 566 } catch (NoSuchFieldException nsfe) { 567 throw new RuntimeException(nsfe); 568 } 569 if (field1 == field2) { 570 System.out.println("ERROR: fields shouldn't have reference equality"); 571 } else { 572 System.out.println("fields are unique"); 573 } 574 if (field1.hashCode() == field2.hashCode() && field1.equals(field2)) { 575 System.out.println("fields are .equals"); 576 } else { 577 System.out.println("ERROR: fields fail equality"); 578 } 579 Method method1, method2; 580 try { 581 method1 = Main.class.getMethod("fancyMethod", ArrayList.class); 582 method2 = Main.class.getMethod("fancyMethod", ArrayList.class); 583 } catch (NoSuchMethodException nsme) { 584 throw new RuntimeException(nsme); 585 } 586 if (method1 == method2) { 587 System.out.println("ERROR: methods shouldn't have reference equality"); 588 } else { 589 System.out.println("methods are unique"); 590 } 591 if (method1.hashCode() == method2.hashCode() && method1.equals(method2)) { 592 System.out.println("methods are .equals"); 593 } else { 594 System.out.println("ERROR: methods fail equality"); 595 } 596 } 597 checkParametrizedTypeEqualsAndHashCode()598 public static void checkParametrizedTypeEqualsAndHashCode() { 599 Method method1; 600 Method method2; 601 Method method3; 602 try { 603 method1 = ParametrizedTypeTest.class.getDeclaredMethod("aMethod", Set.class); 604 method2 = ParametrizedTypeTest.class.getDeclaredMethod("aMethod", Set.class); 605 method3 = ParametrizedTypeTest.class.getDeclaredMethod("aMethodIdentical", Set.class); 606 } catch (NoSuchMethodException nsme) { 607 throw new RuntimeException(nsme); 608 } 609 610 List<Type> types1 = Arrays.asList(method1.getGenericParameterTypes()); 611 List<Type> types2 = Arrays.asList(method2.getGenericParameterTypes()); 612 List<Type> types3 = Arrays.asList(method3.getGenericParameterTypes()); 613 614 Type type1 = types1.get(0); 615 Type type2 = types2.get(0); 616 Type type3 = types3.get(0); 617 618 if (type1 instanceof ParameterizedType) { 619 System.out.println("type1 is a ParameterizedType"); 620 } 621 if (type2 instanceof ParameterizedType) { 622 System.out.println("type2 is a ParameterizedType"); 623 } 624 if (type3 instanceof ParameterizedType) { 625 System.out.println("type3 is a ParameterizedType"); 626 } 627 628 if (type1.equals(type2)) { 629 System.out.println("type1("+type1+") equals type2("+type2+")"); 630 } else { 631 System.out.println("type1("+type1+") does not equal type2("+type2+")"); 632 } 633 634 if (type1.equals(type3)) { 635 System.out.println("type1("+type1+") equals type3("+type3+")"); 636 } else { 637 System.out.println("type1("+type1+") does not equal type3("+type3+")"); 638 } 639 if (type1.hashCode() == type2.hashCode()) { 640 System.out.println("type1("+type1+") hashCode equals type2("+type2+") hashCode"); 641 } else { 642 System.out.println( 643 "type1("+type1+") hashCode does not equal type2("+type2+") hashCode"); 644 } 645 646 if (type1.hashCode() == type3.hashCode()) { 647 System.out.println("type1("+type1+") hashCode equals type3("+type3+") hashCode"); 648 } else { 649 System.out.println( 650 "type1("+type1+") hashCode does not equal type3("+type3+") hashCode"); 651 } 652 } 653 checkGenericArrayTypeEqualsAndHashCode()654 public static void checkGenericArrayTypeEqualsAndHashCode() { 655 Method method1; 656 Method method2; 657 Method method3; 658 try { 659 method1 = GenericArrayTypeTest.class.getDeclaredMethod("aMethod", Object[].class); 660 method2 = GenericArrayTypeTest.class.getDeclaredMethod("aMethod", Object[].class); 661 method3 = GenericArrayTypeTest.class.getDeclaredMethod("aMethodIdentical", Object[].class); 662 } catch (NoSuchMethodException nsme) { 663 throw new RuntimeException(nsme); 664 } 665 666 List<Type> types1 = Arrays.asList(method1.getGenericParameterTypes()); 667 List<Type> types2 = Arrays.asList(method2.getGenericParameterTypes()); 668 List<Type> types3 = Arrays.asList(method3.getGenericParameterTypes()); 669 670 Type type1 = types1.get(0); 671 Type type2 = types2.get(0); 672 Type type3 = types3.get(0); 673 674 if (type1 instanceof GenericArrayType) { 675 System.out.println("type1 is a GenericArrayType"); 676 } 677 if (type2 instanceof GenericArrayType) { 678 System.out.println("type2 is a GenericArrayType"); 679 } 680 if (type3 instanceof GenericArrayType) { 681 System.out.println("type3 is a GenericArrayType"); 682 } 683 684 if (type1.equals(type2)) { 685 System.out.println("type1("+type1+") equals type2("+type2+")"); 686 } else { 687 System.out.println("type1("+type1+") does not equal type2("+type2+")"); 688 } 689 690 if (type1.equals(type3)) { 691 System.out.println("type1("+type1+") equals type3("+type3+")"); 692 } else { 693 System.out.println("type1("+type1+") does not equal type3("+type3+")"); 694 } 695 if (type1.hashCode() == type2.hashCode()) { 696 System.out.println("type1("+type1+") hashCode equals type2("+type2+") hashCode"); 697 } else { 698 System.out.println( 699 "type1("+type1+") hashCode does not equal type2("+type2+") hashCode"); 700 } 701 702 if (type1.hashCode() == type3.hashCode()) { 703 System.out.println("type1("+type1+") hashCode equals type3("+type3+") hashCode"); 704 } else { 705 System.out.println( 706 "type1("+type1+") hashCode does not equal type3("+type3+") hashCode"); 707 } 708 } 709 checkGetDeclaredConstructor()710 private static void checkGetDeclaredConstructor() { 711 try { 712 Method.class.getDeclaredConstructor().setAccessible(true); 713 System.out.println("Didn't get an exception from Method.class.getDeclaredConstructor().setAccessible"); 714 } catch (SecurityException e) { 715 } catch (NoSuchMethodException e) { 716 } catch (Exception e) { 717 System.out.println(e); 718 } 719 try { 720 Field.class.getDeclaredConstructor().setAccessible(true); 721 System.out.println("Didn't get an exception from Field.class.getDeclaredConstructor().setAccessible"); 722 } catch (SecurityException e) { 723 } catch (NoSuchMethodException e) { 724 } catch (Exception e) { 725 System.out.println(e); 726 } 727 try { 728 Class.class.getDeclaredConstructor().setAccessible(true); 729 System.out.println("Didn't get an exception from Class.class.getDeclaredConstructor().setAccessible"); 730 } catch (SecurityException e) { 731 } catch (NoSuchMethodException e) { 732 } catch (Exception e) { 733 System.out.println(e); 734 } 735 } 736 checkPrivateFieldAccess()737 static void checkPrivateFieldAccess() { 738 (new OtherClass()).test(); 739 } 740 main(String[] args)741 public static void main(String[] args) throws Exception { 742 Main test = new Main(); 743 test.run(); 744 745 checkGetDeclaredConstructor(); 746 checkAccess(); 747 checkSwap(); 748 checkClinitForFields(); 749 checkClinitForMethods(); 750 checkGeneric(); 751 checkUnique(); 752 checkParametrizedTypeEqualsAndHashCode(); 753 checkGenericArrayTypeEqualsAndHashCode(); 754 checkPrivateFieldAccess(); 755 } 756 } 757 758 759 class SuperTarget { SuperTarget()760 public SuperTarget() { 761 System.out.println("SuperTarget constructor ()V"); 762 superInt = 1010101; 763 superClassInt = 1010102; 764 } 765 myMethod(float floatArg)766 public int myMethod(float floatArg) { 767 System.out.println("myMethod (F)I " + floatArg); 768 return 6; 769 } 770 771 public int superInt; 772 public static int superClassInt; 773 } 774 775 class Target extends SuperTarget { Target()776 public Target() { 777 System.out.println("Target constructor ()V"); 778 } 779 Target(int ii, float ff)780 public Target(int ii, float ff) { 781 System.out.println("Target constructor (IF)V : ii=" 782 + ii + " ff=" + ff); 783 anInt = ii; 784 } 785 myMethod(int intarg)786 public int myMethod(int intarg) throws NullPointerException, IOException { 787 System.out.println("myMethod (I)I"); 788 System.out.println(" arg=" + intarg + " anInt=" + anInt); 789 return 5; 790 } 791 myMethod(String[] strarg, float f, char c)792 public int myMethod(String[] strarg, float f, char c) { 793 System.out.println("myMethod: " + strarg[0] + " " + f + " " + c + " !"); 794 return 7; 795 } 796 myNoargMethod()797 public static void myNoargMethod() { 798 System.out.println("myNoargMethod ()V"); 799 } 800 throwingMethod()801 public void throwingMethod() { 802 System.out.println("throwingMethod"); 803 throw new NullPointerException("gratuitous throw!"); 804 } 805 misc()806 public void misc() { 807 System.out.println("misc"); 808 } 809 810 public int anInt; 811 public String string1 = "hey"; 812 public String string2 = "yo"; 813 public String string3 = "there"; 814 private String string4 = "naughty"; 815 public static final String constantString = "a constant string"; 816 private int aPrivateInt; 817 818 public final int cantTouchThis = 77; 819 820 public long pubLong = 0x1122334455667788L; 821 822 public static double staticDouble = 3.3; 823 } 824 825 class FieldNoisyInit { 826 static { 827 System.out.println("FieldNoisyInit is initializing"); 828 //Throwable th = new Throwable(); 829 //th.printStackTrace(System.out); 830 } 831 } 832 833 class FieldNoisyInitUser { 834 static { 835 System.out.println("FieldNoisyInitUser is initializing"); 836 } 837 public static int staticField; 838 public static FieldNoisyInit noisy; 839 } 840 841 class MethodNoisyInit { 842 static { 843 System.out.println("MethodNoisyInit is initializing"); 844 //Throwable th = new Throwable(); 845 //th.printStackTrace(System.out); 846 } 847 } 848 849 class MethodNoisyInitUser { 850 static { 851 System.out.println("MethodNoisyInitUser is initializing"); 852 } staticMethod()853 public static void staticMethod() {} createMethodNoisyInit(MethodNoisyInit ni)854 public void createMethodNoisyInit(MethodNoisyInit ni) {} 855 } 856 857 class Thrower { Thrower()858 public Thrower() throws UnsupportedOperationException { 859 throw new UnsupportedOperationException(); 860 } 861 } 862 863 class ParametrizedTypeTest { aMethod(Set<String> names)864 public void aMethod(Set<String> names) {} aMethodIdentical(Set<String> names)865 public void aMethodIdentical(Set<String> names) {} 866 } 867 868 class GenericArrayTypeTest<T> { aMethod(T[] names)869 public void aMethod(T[] names) {} aMethodIdentical(T[] names)870 public void aMethodIdentical(T[] names) {} 871 } 872 873 class OtherClass { 874 private static final long LONG = 1234; test()875 public void test() { 876 try { 877 Field field = getClass().getDeclaredField("LONG"); 878 if (1234 != field.getLong(null)) { 879 System.out.println("ERROR: values don't match"); 880 } 881 } catch (Exception e) { 882 System.out.println(e); 883 } 884 } 885 } 886