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     } 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