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