xref: /aosp_15_r20/art/test/046-reflect/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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