1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2011 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.util.*; 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker class Main { 21*795d594fSAndroid Build Coastguard Worker private static boolean z = true; 22*795d594fSAndroid Build Coastguard Worker private static byte b = 8; 23*795d594fSAndroid Build Coastguard Worker private static char c = '\u2714'; 24*795d594fSAndroid Build Coastguard Worker private static double d = Math.PI; 25*795d594fSAndroid Build Coastguard Worker private static float f = 3.14f; 26*795d594fSAndroid Build Coastguard Worker private static int i = 32; 27*795d594fSAndroid Build Coastguard Worker private static long j = 0x0123456789abcdefL; 28*795d594fSAndroid Build Coastguard Worker private static short s = 16; 29*795d594fSAndroid Build Coastguard Worker testFieldReflection()30*795d594fSAndroid Build Coastguard Worker public static void testFieldReflection() throws Exception { 31*795d594fSAndroid Build Coastguard Worker Field f; 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("z"); 34*795d594fSAndroid Build Coastguard Worker System.out.println(f.getBoolean(null)); 35*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("b"); 36*795d594fSAndroid Build Coastguard Worker System.out.println(f.getByte(null)); 37*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("c"); 38*795d594fSAndroid Build Coastguard Worker System.out.println(f.getChar(null)); 39*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("d"); 40*795d594fSAndroid Build Coastguard Worker System.out.println(f.getDouble(null)); 41*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("f"); 42*795d594fSAndroid Build Coastguard Worker System.out.println(f.getFloat(null)); 43*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("i"); 44*795d594fSAndroid Build Coastguard Worker System.out.println(f.getInt(null)); 45*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("j"); 46*795d594fSAndroid Build Coastguard Worker System.out.println(f.getLong(null)); 47*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("s"); 48*795d594fSAndroid Build Coastguard Worker System.out.println(f.getShort(null)); 49*795d594fSAndroid Build Coastguard Worker 50*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("z"); 51*795d594fSAndroid Build Coastguard Worker f.setBoolean(null, false); 52*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("b"); 53*795d594fSAndroid Build Coastguard Worker f.setByte(null, (byte) 7); 54*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("c"); 55*795d594fSAndroid Build Coastguard Worker f.setChar(null, 'y'); 56*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("d"); 57*795d594fSAndroid Build Coastguard Worker f.setDouble(null, 2.7); 58*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("f"); 59*795d594fSAndroid Build Coastguard Worker f.setFloat(null, 2.7f); 60*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("i"); 61*795d594fSAndroid Build Coastguard Worker f.setInt(null, 31); 62*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("j"); 63*795d594fSAndroid Build Coastguard Worker f.setLong(null, 63); 64*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("s"); 65*795d594fSAndroid Build Coastguard Worker f.setShort(null, (short) 15); 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("z"); 68*795d594fSAndroid Build Coastguard Worker System.out.println(f.getBoolean(null)); 69*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("b"); 70*795d594fSAndroid Build Coastguard Worker System.out.println(f.getByte(null)); 71*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("c"); 72*795d594fSAndroid Build Coastguard Worker System.out.println(f.getChar(null)); 73*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("d"); 74*795d594fSAndroid Build Coastguard Worker System.out.println(f.getDouble(null)); 75*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("f"); 76*795d594fSAndroid Build Coastguard Worker System.out.println(f.getFloat(null)); 77*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("i"); 78*795d594fSAndroid Build Coastguard Worker System.out.println(f.getInt(null)); 79*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("j"); 80*795d594fSAndroid Build Coastguard Worker System.out.println(f.getLong(null)); 81*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("s"); 82*795d594fSAndroid Build Coastguard Worker System.out.println(f.getShort(null)); 83*795d594fSAndroid Build Coastguard Worker 84*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("z"); 85*795d594fSAndroid Build Coastguard Worker f.set(null, Boolean.valueOf(true)); 86*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("b"); 87*795d594fSAndroid Build Coastguard Worker f.set(null, Byte.valueOf((byte) 6)); 88*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("c"); 89*795d594fSAndroid Build Coastguard Worker f.set(null, Character.valueOf('z')); 90*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("d"); 91*795d594fSAndroid Build Coastguard Worker f.set(null, Double.valueOf(1.3)); 92*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("f"); 93*795d594fSAndroid Build Coastguard Worker f.set(null, Float.valueOf(1.3f)); 94*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("i"); 95*795d594fSAndroid Build Coastguard Worker f.set(null, Integer.valueOf(30)); 96*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("j"); 97*795d594fSAndroid Build Coastguard Worker f.set(null, Long.valueOf(62)); 98*795d594fSAndroid Build Coastguard Worker f.set(null, Integer.valueOf(62)); 99*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("s"); 100*795d594fSAndroid Build Coastguard Worker f.set(null, Short.valueOf((short) 14)); 101*795d594fSAndroid Build Coastguard Worker 102*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("z"); 103*795d594fSAndroid Build Coastguard Worker System.out.println(f.getBoolean(null)); 104*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("b"); 105*795d594fSAndroid Build Coastguard Worker System.out.println(f.getByte(null)); 106*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("c"); 107*795d594fSAndroid Build Coastguard Worker System.out.println(f.getChar(null)); 108*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("d"); 109*795d594fSAndroid Build Coastguard Worker System.out.println(f.getDouble(null)); 110*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("f"); 111*795d594fSAndroid Build Coastguard Worker System.out.println(f.getFloat(null)); 112*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("i"); 113*795d594fSAndroid Build Coastguard Worker System.out.println(f.getInt(null)); 114*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("j"); 115*795d594fSAndroid Build Coastguard Worker System.out.println(f.getLong(null)); 116*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("s"); 117*795d594fSAndroid Build Coastguard Worker System.out.println(f.getShort(null)); 118*795d594fSAndroid Build Coastguard Worker 119*795d594fSAndroid Build Coastguard Worker try { 120*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("s"); 121*795d594fSAndroid Build Coastguard Worker f.set(null, Integer.valueOf(14)); 122*795d594fSAndroid Build Coastguard Worker System.out.println("************* should have thrown!"); 123*795d594fSAndroid Build Coastguard Worker } catch (IllegalArgumentException expected) { 124*795d594fSAndroid Build Coastguard Worker System.out.println("got expected IllegalArgumentException"); 125*795d594fSAndroid Build Coastguard Worker } 126*795d594fSAndroid Build Coastguard Worker 127*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("z"); 128*795d594fSAndroid Build Coastguard Worker show(f.get(null)); 129*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("b"); 130*795d594fSAndroid Build Coastguard Worker show(f.get(null)); 131*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("c"); 132*795d594fSAndroid Build Coastguard Worker show(f.get(null)); 133*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("d"); 134*795d594fSAndroid Build Coastguard Worker show(f.get(null)); 135*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("f"); 136*795d594fSAndroid Build Coastguard Worker show(f.get(null)); 137*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("i"); 138*795d594fSAndroid Build Coastguard Worker show(f.get(null)); 139*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("j"); 140*795d594fSAndroid Build Coastguard Worker show(f.get(null)); 141*795d594fSAndroid Build Coastguard Worker f = Main.class.getDeclaredField("s"); 142*795d594fSAndroid Build Coastguard Worker show(f.get(null)); 143*795d594fSAndroid Build Coastguard Worker 144*795d594fSAndroid Build Coastguard Worker /* 145*795d594fSAndroid Build Coastguard Worker private static boolean z = true; 146*795d594fSAndroid Build Coastguard Worker private static byte b = 8; 147*795d594fSAndroid Build Coastguard Worker private static char c = '\u2714'; 148*795d594fSAndroid Build Coastguard Worker private static double d = Math.PI; 149*795d594fSAndroid Build Coastguard Worker private static float f = 3.14f; 150*795d594fSAndroid Build Coastguard Worker private static int i = 32; 151*795d594fSAndroid Build Coastguard Worker private static long j = 0x0123456789abcdefL; 152*795d594fSAndroid Build Coastguard Worker private static short s = 16; 153*795d594fSAndroid Build Coastguard Worker */ 154*795d594fSAndroid Build Coastguard Worker } 155*795d594fSAndroid Build Coastguard Worker show(Object o)156*795d594fSAndroid Build Coastguard Worker private static void show(Object o) { 157*795d594fSAndroid Build Coastguard Worker System.out.println(o + " (" + (o != null ? o.getClass() : "null") + ")"); 158*795d594fSAndroid Build Coastguard Worker } 159*795d594fSAndroid Build Coastguard Worker 160*795d594fSAndroid Build Coastguard Worker /** 161*795d594fSAndroid Build Coastguard Worker * Sorts the input array using the comparator and returns the sorted array. 162*795d594fSAndroid Build Coastguard Worker */ sort(Object[] objects, Comparator<Object> comp)163*795d594fSAndroid Build Coastguard Worker private static Object[] sort(Object[] objects, Comparator<Object> comp) { 164*795d594fSAndroid Build Coastguard Worker Arrays.sort(objects, comp); 165*795d594fSAndroid Build Coastguard Worker return objects; 166*795d594fSAndroid Build Coastguard Worker } 167*795d594fSAndroid Build Coastguard Worker testMethodReflection()168*795d594fSAndroid Build Coastguard Worker public static void testMethodReflection() throws Exception { 169*795d594fSAndroid Build Coastguard Worker Comparator<Object> comp = new Comparator<Object>() { 170*795d594fSAndroid Build Coastguard Worker public int compare(Object a, Object b) { 171*795d594fSAndroid Build Coastguard Worker return a.toString().compareTo(b.toString()); 172*795d594fSAndroid Build Coastguard Worker } 173*795d594fSAndroid Build Coastguard Worker public boolean equals(Object b) { 174*795d594fSAndroid Build Coastguard Worker return this == b; 175*795d594fSAndroid Build Coastguard Worker } 176*795d594fSAndroid Build Coastguard Worker }; 177*795d594fSAndroid Build Coastguard Worker 178*795d594fSAndroid Build Coastguard Worker // Sort the return values by their string values since the order is undefined by the spec. 179*795d594fSAndroid Build Coastguard Worker System.out.println(Arrays.toString(sort(String.class.getDeclaredConstructors(), comp))); 180*795d594fSAndroid Build Coastguard Worker System.out.println(Arrays.toString(sort(String.class.getDeclaredFields(), comp))); 181*795d594fSAndroid Build Coastguard Worker System.out.println(Arrays.toString(sort(String.class.getDeclaredMethods(), comp))); 182*795d594fSAndroid Build Coastguard Worker 183*795d594fSAndroid Build Coastguard Worker System.out.println(Arrays.toString(Main.class.getInterfaces())); 184*795d594fSAndroid Build Coastguard Worker System.out.println(Arrays.toString(String.class.getInterfaces())); 185*795d594fSAndroid Build Coastguard Worker 186*795d594fSAndroid Build Coastguard Worker System.out.println(Main.class.getModifiers()); 187*795d594fSAndroid Build Coastguard Worker System.out.println(String.class.getModifiers()); 188*795d594fSAndroid Build Coastguard Worker 189*795d594fSAndroid Build Coastguard Worker System.out.println(String.class.isAssignableFrom(Object.class)); 190*795d594fSAndroid Build Coastguard Worker System.out.println(Object.class.isAssignableFrom(String.class)); 191*795d594fSAndroid Build Coastguard Worker 192*795d594fSAndroid Build Coastguard Worker System.out.println(String.class.isInstance("hello")); 193*795d594fSAndroid Build Coastguard Worker System.out.println(String.class.isInstance(123)); 194*795d594fSAndroid Build Coastguard Worker 195*795d594fSAndroid Build Coastguard Worker Method m; 196*795d594fSAndroid Build Coastguard Worker 197*795d594fSAndroid Build Coastguard Worker m = Main.class.getDeclaredMethod("IV", int.class); 198*795d594fSAndroid Build Coastguard Worker System.out.println(Arrays.toString(m.getParameterTypes())); 199*795d594fSAndroid Build Coastguard Worker show(m.invoke(null, 4444)); 200*795d594fSAndroid Build Coastguard Worker System.out.println(Arrays.toString(m.getParameterTypes())); 201*795d594fSAndroid Build Coastguard Worker 202*795d594fSAndroid Build Coastguard Worker m = Main.class.getDeclaredMethod("IIV", int.class, int.class); 203*795d594fSAndroid Build Coastguard Worker System.out.println(Arrays.toString(m.getParameterTypes())); 204*795d594fSAndroid Build Coastguard Worker show(m.invoke(null, 1111, 2222)); 205*795d594fSAndroid Build Coastguard Worker 206*795d594fSAndroid Build Coastguard Worker m = Main.class.getDeclaredMethod("III", int.class, int.class); 207*795d594fSAndroid Build Coastguard Worker System.out.println(Arrays.toString(m.getParameterTypes())); 208*795d594fSAndroid Build Coastguard Worker show(m.invoke(null, 1111, 2222)); 209*795d594fSAndroid Build Coastguard Worker 210*795d594fSAndroid Build Coastguard Worker m = Main.class.getDeclaredMethod("sumArray", int[].class); 211*795d594fSAndroid Build Coastguard Worker System.out.println(Arrays.toString(m.getParameterTypes())); 212*795d594fSAndroid Build Coastguard Worker show(m.invoke(null, new int[] { 1, 2, 3, 4 })); 213*795d594fSAndroid Build Coastguard Worker 214*795d594fSAndroid Build Coastguard Worker m = Main.class.getDeclaredMethod("concat", String[].class); 215*795d594fSAndroid Build Coastguard Worker System.out.println(Arrays.toString(m.getParameterTypes())); 216*795d594fSAndroid Build Coastguard Worker show(m.invoke(null, (Object) new String[] { "h", "e", "l", "l", "o" })); 217*795d594fSAndroid Build Coastguard Worker 218*795d594fSAndroid Build Coastguard Worker m = Main.class.getDeclaredMethod("ZBCDFIJSV", boolean.class, byte.class, char.class, double.class, float.class, int.class, long.class, short.class); 219*795d594fSAndroid Build Coastguard Worker System.out.println(Arrays.toString(m.getParameterTypes())); 220*795d594fSAndroid Build Coastguard Worker show(m.invoke(null, true, (byte) 0, '1', 2, 3, 4, 5, (short) 6)); 221*795d594fSAndroid Build Coastguard Worker 222*795d594fSAndroid Build Coastguard Worker m = Main.class.getDeclaredMethod("ZBCDLFIJSV", boolean.class, byte.class, char.class, double.class, String.class, float.class, int.class, long.class, short.class); 223*795d594fSAndroid Build Coastguard Worker System.out.println(Arrays.toString(m.getParameterTypes())); 224*795d594fSAndroid Build Coastguard Worker show(m.invoke(null, true, (byte) 0, '1', 2, "hello world", 3, 4, 5, (short) 6)); 225*795d594fSAndroid Build Coastguard Worker 226*795d594fSAndroid Build Coastguard Worker try { 227*795d594fSAndroid Build Coastguard Worker m = Main.class.getDeclaredMethod("thrower"); 228*795d594fSAndroid Build Coastguard Worker System.out.println(Arrays.toString(m.getParameterTypes())); 229*795d594fSAndroid Build Coastguard Worker show(m.invoke(null)); 230*795d594fSAndroid Build Coastguard Worker System.out.println("************* should have thrown!"); 231*795d594fSAndroid Build Coastguard Worker } catch (InvocationTargetException expected) { 232*795d594fSAndroid Build Coastguard Worker System.out.println("got expected InvocationTargetException"); 233*795d594fSAndroid Build Coastguard Worker } 234*795d594fSAndroid Build Coastguard Worker } 235*795d594fSAndroid Build Coastguard Worker thrower()236*795d594fSAndroid Build Coastguard Worker private static void thrower() { 237*795d594fSAndroid Build Coastguard Worker throw new ArithmeticException("surprise!"); 238*795d594fSAndroid Build Coastguard Worker } 239*795d594fSAndroid Build Coastguard Worker sumArray(int[] xs)240*795d594fSAndroid Build Coastguard Worker private static int sumArray(int[] xs) { 241*795d594fSAndroid Build Coastguard Worker int result = 0; 242*795d594fSAndroid Build Coastguard Worker for (int x : xs) { 243*795d594fSAndroid Build Coastguard Worker result += x; 244*795d594fSAndroid Build Coastguard Worker } 245*795d594fSAndroid Build Coastguard Worker return result; 246*795d594fSAndroid Build Coastguard Worker } 247*795d594fSAndroid Build Coastguard Worker concat(String[] strings)248*795d594fSAndroid Build Coastguard Worker private static String concat(String[] strings) { 249*795d594fSAndroid Build Coastguard Worker String result = ""; 250*795d594fSAndroid Build Coastguard Worker for (String s : strings) { 251*795d594fSAndroid Build Coastguard Worker result += s; 252*795d594fSAndroid Build Coastguard Worker } 253*795d594fSAndroid Build Coastguard Worker return result; 254*795d594fSAndroid Build Coastguard Worker } 255*795d594fSAndroid Build Coastguard Worker IV(int i)256*795d594fSAndroid Build Coastguard Worker private static void IV(int i) { 257*795d594fSAndroid Build Coastguard Worker System.out.println(i); 258*795d594fSAndroid Build Coastguard Worker } 259*795d594fSAndroid Build Coastguard Worker IIV(int i, int j)260*795d594fSAndroid Build Coastguard Worker private static void IIV(int i, int j) { 261*795d594fSAndroid Build Coastguard Worker System.out.println(i + " " + j); 262*795d594fSAndroid Build Coastguard Worker } 263*795d594fSAndroid Build Coastguard Worker III(int i, int j)264*795d594fSAndroid Build Coastguard Worker private static int III(int i, int j) { 265*795d594fSAndroid Build Coastguard Worker System.out.println(i + " " + j); 266*795d594fSAndroid Build Coastguard Worker return i + j; 267*795d594fSAndroid Build Coastguard Worker } 268*795d594fSAndroid Build Coastguard Worker ZBCDFIJSV(boolean z, byte b, char c, double d, float f, int i, long l, short s)269*795d594fSAndroid Build Coastguard Worker private static void ZBCDFIJSV(boolean z, byte b, char c, double d, float f, int i, long l, short s) { 270*795d594fSAndroid Build Coastguard Worker System.out.println(z + " " + b + " " + c + " " + d + " " + f + " " + i + " " + l + " " + s); 271*795d594fSAndroid Build Coastguard Worker } 272*795d594fSAndroid Build Coastguard Worker ZBCDLFIJSV(boolean z, byte b, char c, double d, String string, float f, int i, long l, short s)273*795d594fSAndroid Build Coastguard Worker private static void ZBCDLFIJSV(boolean z, byte b, char c, double d, String string, float f, int i, long l, short s) { 274*795d594fSAndroid Build Coastguard Worker System.out.println(z + " " + b + " " + c + " " + d + " " + " " + string + " " + f + " " + i + " " + l + " " + s); 275*795d594fSAndroid Build Coastguard Worker } 276*795d594fSAndroid Build Coastguard Worker testConstructorReflection()277*795d594fSAndroid Build Coastguard Worker public static void testConstructorReflection() throws Exception { 278*795d594fSAndroid Build Coastguard Worker Constructor<String> ctor = String.class.getConstructor(); 279*795d594fSAndroid Build Coastguard Worker show(ctor.newInstance()); 280*795d594fSAndroid Build Coastguard Worker 281*795d594fSAndroid Build Coastguard Worker ctor = String.class.getConstructor(char[].class, int.class, int.class); 282*795d594fSAndroid Build Coastguard Worker show(ctor.newInstance(new char[] { '\u2714', 'y', 'z', '!' }, 1, 2)); 283*795d594fSAndroid Build Coastguard Worker } 284*795d594fSAndroid Build Coastguard Worker testPackagePrivateConstructor()285*795d594fSAndroid Build Coastguard Worker private static void testPackagePrivateConstructor() { 286*795d594fSAndroid Build Coastguard Worker try { 287*795d594fSAndroid Build Coastguard Worker Class<?> c = Class.forName("sub.PPClass"); 288*795d594fSAndroid Build Coastguard Worker Constructor<?> cons = c.getConstructor(); 289*795d594fSAndroid Build Coastguard Worker cons.newInstance(); 290*795d594fSAndroid Build Coastguard Worker throw new RuntimeException("Expected IllegalAccessException."); 291*795d594fSAndroid Build Coastguard Worker } catch (IllegalAccessException e) { 292*795d594fSAndroid Build Coastguard Worker // Expected. 293*795d594fSAndroid Build Coastguard Worker } catch (Exception e) { 294*795d594fSAndroid Build Coastguard Worker // Error. 295*795d594fSAndroid Build Coastguard Worker e.printStackTrace(System.out); 296*795d594fSAndroid Build Coastguard Worker } 297*795d594fSAndroid Build Coastguard Worker } 298*795d594fSAndroid Build Coastguard Worker testPackagePrivateAccessibleConstructor()299*795d594fSAndroid Build Coastguard Worker private static void testPackagePrivateAccessibleConstructor() { 300*795d594fSAndroid Build Coastguard Worker try { 301*795d594fSAndroid Build Coastguard Worker Class<?> c = Class.forName("sub.PPClass"); 302*795d594fSAndroid Build Coastguard Worker Constructor<?> cons = c.getConstructor(); 303*795d594fSAndroid Build Coastguard Worker cons.setAccessible(true); // ensure we prevent IllegalAccessException 304*795d594fSAndroid Build Coastguard Worker cons.newInstance(); 305*795d594fSAndroid Build Coastguard Worker } catch (Exception e) { 306*795d594fSAndroid Build Coastguard Worker // Error. 307*795d594fSAndroid Build Coastguard Worker e.printStackTrace(System.out); 308*795d594fSAndroid Build Coastguard Worker } 309*795d594fSAndroid Build Coastguard Worker } 310*795d594fSAndroid Build Coastguard Worker testReflectFieldSetDuringClinit()311*795d594fSAndroid Build Coastguard Worker private static void testReflectFieldSetDuringClinit() { 312*795d594fSAndroid Build Coastguard Worker try { 313*795d594fSAndroid Build Coastguard Worker int value = ReflectFieldSetDuringClinit.intField; 314*795d594fSAndroid Build Coastguard Worker int expected = 42; 315*795d594fSAndroid Build Coastguard Worker if (value != expected) { 316*795d594fSAndroid Build Coastguard Worker System.out.println("Unexpected value: " + value + ", expected: " + expected); 317*795d594fSAndroid Build Coastguard Worker } 318*795d594fSAndroid Build Coastguard Worker } catch (Exception e) { 319*795d594fSAndroid Build Coastguard Worker // Error. 320*795d594fSAndroid Build Coastguard Worker e.printStackTrace(System.out); 321*795d594fSAndroid Build Coastguard Worker } 322*795d594fSAndroid Build Coastguard Worker } 323*795d594fSAndroid Build Coastguard Worker testReflectNewInstanceDuringClinit()324*795d594fSAndroid Build Coastguard Worker private static void testReflectNewInstanceDuringClinit() { 325*795d594fSAndroid Build Coastguard Worker try { 326*795d594fSAndroid Build Coastguard Worker int value = ReflectNewInstanceDuringClinit.instance.intField; 327*795d594fSAndroid Build Coastguard Worker int expected = 42; 328*795d594fSAndroid Build Coastguard Worker if (value != expected) { 329*795d594fSAndroid Build Coastguard Worker System.out.println("Unexpected value: " + value + ", expected: " + expected); 330*795d594fSAndroid Build Coastguard Worker } 331*795d594fSAndroid Build Coastguard Worker } catch (Exception e) { 332*795d594fSAndroid Build Coastguard Worker // Error. 333*795d594fSAndroid Build Coastguard Worker e.printStackTrace(System.out); 334*795d594fSAndroid Build Coastguard Worker } 335*795d594fSAndroid Build Coastguard Worker } 336*795d594fSAndroid Build Coastguard Worker main(String[] args)337*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) throws Exception { 338*795d594fSAndroid Build Coastguard Worker testFieldReflection(); 339*795d594fSAndroid Build Coastguard Worker testMethodReflection(); 340*795d594fSAndroid Build Coastguard Worker testConstructorReflection(); 341*795d594fSAndroid Build Coastguard Worker testPackagePrivateConstructor(); 342*795d594fSAndroid Build Coastguard Worker testPackagePrivateAccessibleConstructor(); 343*795d594fSAndroid Build Coastguard Worker testReflectFieldSetDuringClinit(); 344*795d594fSAndroid Build Coastguard Worker testReflectNewInstanceDuringClinit(); 345*795d594fSAndroid Build Coastguard Worker } 346*795d594fSAndroid Build Coastguard Worker } 347*795d594fSAndroid Build Coastguard Worker 348*795d594fSAndroid Build Coastguard Worker class ReflectFieldSetDuringClinit { 349*795d594fSAndroid Build Coastguard Worker public static int intField; 350*795d594fSAndroid Build Coastguard Worker 351*795d594fSAndroid Build Coastguard Worker static { 352*795d594fSAndroid Build Coastguard Worker try { 353*795d594fSAndroid Build Coastguard Worker Field f = ReflectFieldSetDuringClinit.class.getDeclaredField("intField"); f.setInt(null, 42)354*795d594fSAndroid Build Coastguard Worker f.setInt(null, 42); 355*795d594fSAndroid Build Coastguard Worker } catch (Exception e) { 356*795d594fSAndroid Build Coastguard Worker // Error. 357*795d594fSAndroid Build Coastguard Worker e.printStackTrace(System.out); 358*795d594fSAndroid Build Coastguard Worker } 359*795d594fSAndroid Build Coastguard Worker } 360*795d594fSAndroid Build Coastguard Worker } 361*795d594fSAndroid Build Coastguard Worker 362*795d594fSAndroid Build Coastguard Worker class ReflectNewInstanceDuringClinit { 363*795d594fSAndroid Build Coastguard Worker public int intField; 364*795d594fSAndroid Build Coastguard Worker ReflectNewInstanceDuringClinit()365*795d594fSAndroid Build Coastguard Worker public ReflectNewInstanceDuringClinit() { 366*795d594fSAndroid Build Coastguard Worker intField = 42; 367*795d594fSAndroid Build Coastguard Worker } 368*795d594fSAndroid Build Coastguard Worker 369*795d594fSAndroid Build Coastguard Worker public static ReflectNewInstanceDuringClinit instance; 370*795d594fSAndroid Build Coastguard Worker 371*795d594fSAndroid Build Coastguard Worker static { 372*795d594fSAndroid Build Coastguard Worker try { 373*795d594fSAndroid Build Coastguard Worker Constructor<?> ctor = ReflectNewInstanceDuringClinit.class.getConstructor(); 374*795d594fSAndroid Build Coastguard Worker instance = (ReflectNewInstanceDuringClinit) ctor.newInstance(); 375*795d594fSAndroid Build Coastguard Worker } catch (Exception e) { 376*795d594fSAndroid Build Coastguard Worker // Error. 377*795d594fSAndroid Build Coastguard Worker e.printStackTrace(System.out); 378*795d594fSAndroid Build Coastguard Worker } 379*795d594fSAndroid Build Coastguard Worker } 380*795d594fSAndroid Build Coastguard Worker } 381