Home | History | Annotate | Download | only in src
      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 
     17 import java.lang.reflect.*;
     18 import java.util.*;
     19 
     20 class 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       System.out.println("************* should have thrown!");
    123     } catch (IllegalArgumentException expected) {
    124       System.out.println("got expected IllegalArgumentException");
    125     }
    126 
    127     f = Main.class.getDeclaredField("z");
    128     show(f.get(null));
    129     f = Main.class.getDeclaredField("b");
    130     show(f.get(null));
    131     f = Main.class.getDeclaredField("c");
    132     show(f.get(null));
    133     f = Main.class.getDeclaredField("d");
    134     show(f.get(null));
    135     f = Main.class.getDeclaredField("f");
    136     show(f.get(null));
    137     f = Main.class.getDeclaredField("i");
    138     show(f.get(null));
    139     f = Main.class.getDeclaredField("j");
    140     show(f.get(null));
    141     f = Main.class.getDeclaredField("s");
    142     show(f.get(null));
    143 
    144     /*
    145     private static boolean z = true;
    146     private static byte b = 8;
    147     private static char c = 'x';
    148     private static double d = Math.PI;
    149     private static float f = 3.14f;
    150     private static int i = 32;
    151     private static long j = 0x0123456789abcdefL;
    152     private static short s = 16;
    153     */
    154   }
    155 
    156   private static void show(Object o) {
    157     System.out.println(o + " (" + (o != null ? o.getClass() : "null") + ")");
    158   }
    159 
    160   public static void testMethodReflection() throws Exception {
    161     System.out.println(Arrays.toString(String.class.getDeclaredConstructors()));
    162     System.out.println(Arrays.toString(String.class.getDeclaredFields()));
    163     System.out.println(Arrays.toString(String.class.getDeclaredMethods()));
    164 
    165     System.out.println(Arrays.toString(Main.class.getInterfaces()));
    166     System.out.println(Arrays.toString(String.class.getInterfaces()));
    167 
    168     System.out.println(Main.class.getModifiers());
    169     System.out.println(String.class.getModifiers());
    170 
    171     System.out.println(String.class.isAssignableFrom(Object.class));
    172     System.out.println(Object.class.isAssignableFrom(String.class));
    173 
    174     System.out.println(String.class.isInstance("hello"));
    175     System.out.println(String.class.isInstance(123));
    176 
    177     Method m;
    178 
    179     m = Main.class.getDeclaredMethod("IV", int.class);
    180     System.out.println(Arrays.toString(m.getParameterTypes()));
    181     show(m.invoke(null, 4444));
    182     System.out.println(Arrays.toString(m.getParameterTypes()));
    183 
    184     m = Main.class.getDeclaredMethod("IIV", int.class, int.class);
    185     System.out.println(Arrays.toString(m.getParameterTypes()));
    186     show(m.invoke(null, 1111, 2222));
    187 
    188     m = Main.class.getDeclaredMethod("III", int.class, int.class);
    189     System.out.println(Arrays.toString(m.getParameterTypes()));
    190     show(m.invoke(null, 1111, 2222));
    191 
    192     m = Main.class.getDeclaredMethod("sumArray", int[].class);
    193     System.out.println(Arrays.toString(m.getParameterTypes()));
    194     show(m.invoke(null, new int[] { 1, 2, 3, 4 }));
    195 
    196     m = Main.class.getDeclaredMethod("concat", String[].class);
    197     System.out.println(Arrays.toString(m.getParameterTypes()));
    198     show(m.invoke(null, (Object) new String[] { "h", "e", "l", "l", "o" }));
    199 
    200     m = Main.class.getDeclaredMethod("ZBCDFIJSV", boolean.class, byte.class, char.class, double.class, float.class, int.class, long.class, short.class);
    201     System.out.println(Arrays.toString(m.getParameterTypes()));
    202     show(m.invoke(null, true, (byte) 0, '1', 2, 3, 4, 5, (short) 6));
    203 
    204     m = Main.class.getDeclaredMethod("ZBCDLFIJSV", boolean.class, byte.class, char.class, double.class, String.class, float.class, int.class, long.class, short.class);
    205     System.out.println(Arrays.toString(m.getParameterTypes()));
    206     show(m.invoke(null, true, (byte) 0, '1', 2, "hello world", 3, 4, 5, (short) 6));
    207 
    208     try {
    209       m = Main.class.getDeclaredMethod("thrower");
    210       System.out.println(Arrays.toString(m.getParameterTypes()));
    211       show(m.invoke(null));
    212       System.out.println("************* should have thrown!");
    213     } catch (InvocationTargetException expected) {
    214       System.out.println("got expected InvocationTargetException");
    215     }
    216   }
    217 
    218   private static void thrower() {
    219     throw new ArithmeticException("surprise!");
    220   }
    221 
    222   private static int sumArray(int[] xs) {
    223     int result = 0;
    224     for (int x : xs) {
    225       result += x;
    226     }
    227     return result;
    228   }
    229 
    230   private static String concat(String[] strings) {
    231     String result = "";
    232     for (String s : strings) {
    233       result += s;
    234     }
    235     return result;
    236   }
    237 
    238   private static void IV(int i) {
    239     System.out.println(i);
    240   }
    241 
    242   private static void IIV(int i, int j) {
    243     System.out.println(i + " " + j);
    244   }
    245 
    246   private static int III(int i, int j) {
    247     System.out.println(i + " " + j);
    248     return i + j;
    249   }
    250 
    251   private static void ZBCDFIJSV(boolean z, byte b, char c, double d, float f, int i, long l, short s) {
    252     System.out.println(z + " " + b + " " + c + " " + d + " " + f + " " + i + " " + l + " " + s);
    253   }
    254 
    255   private static void ZBCDLFIJSV(boolean z, byte b, char c, double d, String string, float f, int i, long l, short s) {
    256     System.out.println(z + " " + b + " " + c + " " + d + " " + " " + string + " " + f + " " + i + " " + l + " " + s);
    257   }
    258 
    259   public static void testConstructorReflection() throws Exception {
    260     Constructor<?> ctor;
    261 
    262     ctor = String.class.getConstructor(new Class[0]);
    263     show(ctor.newInstance((Object[]) null));
    264 
    265     ctor = String.class.getConstructor(char[].class, int.class, int.class);
    266     show(ctor.newInstance(new char[] { 'x', 'y', 'z', '!' }, 1, 2));
    267   }
    268 
    269   public static void main(String[] args) throws Exception {
    270     testFieldReflection();
    271     testMethodReflection();
    272     testConstructorReflection();
    273   }
    274 }
    275