1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17import java.lang.reflect.*;
18import java.util.*;
19
20class Main {
21  private static boolean z = true;
22  private static byte b = 8;
23  private static char c = 'x';
24  private static double d = Math.PI;
25  private static float f = 3.14f;
26  private static int i = 32;
27  private static long j = 0x0123456789abcdefL;
28  private static short s = 16;
29
30  public static void testFieldReflection() throws Exception {
31    Field f;
32
33    f = Main.class.getDeclaredField("z");
34    System.out.println(f.getBoolean(null));
35    f = Main.class.getDeclaredField("b");
36    System.out.println(f.getByte(null));
37    f = Main.class.getDeclaredField("c");
38    System.out.println(f.getChar(null));
39    f = Main.class.getDeclaredField("d");
40    System.out.println(f.getDouble(null));
41    f = Main.class.getDeclaredField("f");
42    System.out.println(f.getFloat(null));
43    f = Main.class.getDeclaredField("i");
44    System.out.println(f.getInt(null));
45    f = Main.class.getDeclaredField("j");
46    System.out.println(f.getLong(null));
47    f = Main.class.getDeclaredField("s");
48    System.out.println(f.getShort(null));
49
50    f = Main.class.getDeclaredField("z");
51    f.setBoolean(null, false);
52    f = Main.class.getDeclaredField("b");
53    f.setByte(null, (byte) 7);
54    f = Main.class.getDeclaredField("c");
55    f.setChar(null, 'y');
56    f = Main.class.getDeclaredField("d");
57    f.setDouble(null, 2.7);
58    f = Main.class.getDeclaredField("f");
59    f.setFloat(null, 2.7f);
60    f = Main.class.getDeclaredField("i");
61    f.setInt(null, 31);
62    f = Main.class.getDeclaredField("j");
63    f.setLong(null, 63);
64    f = Main.class.getDeclaredField("s");
65    f.setShort(null, (short) 15);
66
67    f = Main.class.getDeclaredField("z");
68    System.out.println(f.getBoolean(null));
69    f = Main.class.getDeclaredField("b");
70    System.out.println(f.getByte(null));
71    f = Main.class.getDeclaredField("c");
72    System.out.println(f.getChar(null));
73    f = Main.class.getDeclaredField("d");
74    System.out.println(f.getDouble(null));
75    f = Main.class.getDeclaredField("f");
76    System.out.println(f.getFloat(null));
77    f = Main.class.getDeclaredField("i");
78    System.out.println(f.getInt(null));
79    f = Main.class.getDeclaredField("j");
80    System.out.println(f.getLong(null));
81    f = Main.class.getDeclaredField("s");
82    System.out.println(f.getShort(null));
83
84    f = Main.class.getDeclaredField("z");
85    f.set(null, Boolean.valueOf(true));
86    f = Main.class.getDeclaredField("b");
87    f.set(null, Byte.valueOf((byte) 6));
88    f = Main.class.getDeclaredField("c");
89    f.set(null, Character.valueOf('z'));
90    f = Main.class.getDeclaredField("d");
91    f.set(null, Double.valueOf(1.3));
92    f = Main.class.getDeclaredField("f");
93    f.set(null, Float.valueOf(1.3f));
94    f = Main.class.getDeclaredField("i");
95    f.set(null, Integer.valueOf(30));
96    f = Main.class.getDeclaredField("j");
97    f.set(null, Long.valueOf(62));
98    f.set(null, Integer.valueOf(62));
99    f = Main.class.getDeclaredField("s");
100    f.set(null, Short.valueOf((short) 14));
101
102    f = Main.class.getDeclaredField("z");
103    System.out.println(f.getBoolean(null));
104    f = Main.class.getDeclaredField("b");
105    System.out.println(f.getByte(null));
106    f = Main.class.getDeclaredField("c");
107    System.out.println(f.getChar(null));
108    f = Main.class.getDeclaredField("d");
109    System.out.println(f.getDouble(null));
110    f = Main.class.getDeclaredField("f");
111    System.out.println(f.getFloat(null));
112    f = Main.class.getDeclaredField("i");
113    System.out.println(f.getInt(null));
114    f = Main.class.getDeclaredField("j");
115    System.out.println(f.getLong(null));
116    f = Main.class.getDeclaredField("s");
117    System.out.println(f.getShort(null));
118
119    try {
120      f = Main.class.getDeclaredField("s");
121      f.set(null, Integer.valueOf(14));
122    } catch (IllegalArgumentException expected) {
123      expected.printStackTrace();
124    }
125
126    f = Main.class.getDeclaredField("z");
127    show(f.get(null));
128    f = Main.class.getDeclaredField("b");
129    show(f.get(null));
130    f = Main.class.getDeclaredField("c");
131    show(f.get(null));
132    f = Main.class.getDeclaredField("d");
133    show(f.get(null));
134    f = Main.class.getDeclaredField("f");
135    show(f.get(null));
136    f = Main.class.getDeclaredField("i");
137    show(f.get(null));
138    f = Main.class.getDeclaredField("j");
139    show(f.get(null));
140    f = Main.class.getDeclaredField("s");
141    show(f.get(null));
142
143    /*
144    private static boolean z = true;
145    private static byte b = 8;
146    private static char c = 'x';
147    private static double d = Math.PI;
148    private static float f = 3.14f;
149    private static int i = 32;
150    private static long j = 0x0123456789abcdefL;
151    private static short s = 16;
152    */
153  }
154
155  private static void show(Object o) {
156    System.out.println(o + " (" + (o != null ? o.getClass() : "null") + ")");
157  }
158
159  public static void testMethodReflection() throws Exception {
160    System.out.println(Arrays.toString(String.class.getDeclaredConstructors()));
161    System.out.println(Arrays.toString(String.class.getDeclaredFields()));
162    System.out.println(Arrays.toString(String.class.getDeclaredMethods()));
163
164    System.out.println(Arrays.toString(Main.class.getInterfaces()));
165    System.out.println(Arrays.toString(String.class.getInterfaces()));
166
167    System.out.println(Main.class.getModifiers());
168    System.out.println(String.class.getModifiers());
169
170    System.out.println(String.class.isAssignableFrom(Object.class));
171    System.out.println(Object.class.isAssignableFrom(String.class));
172
173    System.out.println(String.class.isInstance("hello"));
174    System.out.println(String.class.isInstance(123));
175
176    Method m;
177
178    m = Main.class.getDeclaredMethod("IV", int.class);
179    System.out.println(Arrays.toString(m.getParameterTypes()));
180    show(m.invoke(null, 4444));
181    System.out.println(Arrays.toString(m.getParameterTypes()));
182
183    m = Main.class.getDeclaredMethod("IIV", int.class, int.class);
184    System.out.println(Arrays.toString(m.getParameterTypes()));
185    show(m.invoke(null, 1111, 2222));
186
187    m = Main.class.getDeclaredMethod("III", int.class, int.class);
188    System.out.println(Arrays.toString(m.getParameterTypes()));
189    show(m.invoke(null, 1111, 2222));
190
191    m = Main.class.getDeclaredMethod("sumArray", int[].class);
192    System.out.println(Arrays.toString(m.getParameterTypes()));
193    show(m.invoke(null, new int[] { 1, 2, 3, 4 }));
194
195    m = Main.class.getDeclaredMethod("concat", String[].class);
196    System.out.println(Arrays.toString(m.getParameterTypes()));
197    show(m.invoke(null, (Object) new String[] { "h", "e", "l", "l", "o" }));
198
199    m = Main.class.getDeclaredMethod("ZBCDFIJSV", boolean.class, byte.class, char.class, double.class, float.class, int.class, long.class, short.class);
200    System.out.println(Arrays.toString(m.getParameterTypes()));
201    show(m.invoke(null, true, (byte) 0, '1', 2, 3, 4, 5, (short) 6));
202
203    m = Main.class.getDeclaredMethod("ZBCDLFIJSV", boolean.class, byte.class, char.class, double.class, String.class, float.class, int.class, long.class, short.class);
204    System.out.println(Arrays.toString(m.getParameterTypes()));
205    show(m.invoke(null, true, (byte) 0, '1', 2, "hello world", 3, 4, 5, (short) 6));
206
207    try {
208      m = Main.class.getDeclaredMethod("thrower");
209      System.out.println(Arrays.toString(m.getParameterTypes()));
210      show(m.invoke(null));
211      System.out.println("************* should have thrown!");
212    } catch (Exception expected) {
213      expected.printStackTrace();
214    }
215  }
216
217  private static void thrower() {
218    throw new ArithmeticException("surprise!");
219  }
220
221  private static int sumArray(int[] xs) {
222    int result = 0;
223    for (int x : xs) {
224      result += x;
225    }
226    return result;
227  }
228
229  private static String concat(String[] strings) {
230    String result = "";
231    for (String s : strings) {
232      result += s;
233    }
234    return result;
235  }
236
237  private static void IV(int i) {
238    System.out.println(i);
239  }
240
241  private static void IIV(int i, int j) {
242    System.out.println(i + " " + j);
243  }
244
245  private static int III(int i, int j) {
246    System.out.println(i + " " + j);
247    return i + j;
248  }
249
250  private static void ZBCDFIJSV(boolean z, byte b, char c, double d, float f, int i, long l, short s) {
251    System.out.println(z + " " + b + " " + c + " " + d + " " + f + " " + i + " " + l + " " + s);
252  }
253
254  private static void ZBCDLFIJSV(boolean z, byte b, char c, double d, String string, float f, int i, long l, short s) {
255    System.out.println(z + " " + b + " " + c + " " + d + " " + " " + string + " " + f + " " + i + " " + l + " " + s);
256  }
257
258  public static void testConstructorReflection() throws Exception {
259    Constructor<?> ctor;
260
261    ctor = String.class.getConstructor(new Class[0]);
262    show(ctor.newInstance((Object[]) null));
263
264    ctor = String.class.getConstructor(char[].class, int.class, int.class);
265    show(ctor.newInstance(new char[] { 'x', 'y', 'z', '!' }, 1, 2));
266  }
267
268  public static void main(String[] args) throws Exception {
269    testFieldReflection();
270    testMethodReflection();
271    testConstructorReflection();
272  }
273}
274