15d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/*
25d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Copyright (C) 2008 The Android Open Source Project
35d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao *
45d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Licensed under the Apache License, Version 2.0 (the "License");
55d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * you may not use this file except in compliance with the License.
65d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * You may obtain a copy of the License at
75d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao *
85d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao *      http://www.apache.org/licenses/LICENSE-2.0
95d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao *
105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Unless required by applicable law or agreed to in writing, software
115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * distributed under the License is distributed on an "AS IS" BASIS,
125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * See the License for the specific language governing permissions and
145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * limitations under the License.
155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */
165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
17c71f652a50e562d88f6aa1d691285101b8912959Ian Rogersimport other.PublicClass;
185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.reflect.Field;
1911d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Haoimport java.lang.reflect.Method;
205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/*
225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Test field access through reflection.
235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */
245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaopublic class Main {
25c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public static void main(String[] args) {
26c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    SubClass.main(null);
27c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
28c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    try {
29c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      GetNonexistent.main(null);
30c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      System.err.println("Not expected to succeed");
31c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    } catch (VerifyError fe) {
32c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      // dalvik
33c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      System.out.println("Got expected failure");
34c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    } catch (NoSuchFieldError nsfe) {
35c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      // reference
36c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      System.out.println("Got expected failure");
375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
38c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  }
39c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
40c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /*
41c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   * Get the field specified by "field" from "obj".
42c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   *
43c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   * "type" determines which "get" call is made, e.g. 'B' turns into
44c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   * field.getByte().
45c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   *
46c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   * The "expectedException" must match the class of the exception thrown,
47c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   * or be null if no exception was expected.
48c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   *
49c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   * On success, the boxed value retrieved is returned.
50c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   */
51c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public Object getValue(Field field, Object obj, char type,
52c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      Class expectedException) {
53c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    Object result = null;
54c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    try {
55c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      switch (type) {
56c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'Z':
57c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getBoolean(obj);
58c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
59c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'B':
60c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getByte(obj);
61c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
62c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'S':
63c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getShort(obj);
64c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
65c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'C':
66c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getChar(obj);
67c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
68c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'I':
69c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getInt(obj);
70c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
71c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'J':
72c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getLong(obj);
73c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
74c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'F':
75c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getFloat(obj);
76c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
77c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'D':
78c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getDouble(obj);
79c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
80c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'L':
81c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.get(obj);
82c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
83c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        default:
84c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          throw new RuntimeException("bad type '" + type + "'");
85c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      }
86c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
87c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      /* success; expected? */
88c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      if (expectedException != null) {
89c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        System.err.println("ERROR: call succeeded for field " + field +
90c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            " with a read of type '" + type +
91c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            "', was expecting " + expectedException);
92c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        Thread.dumpStack();
93c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      }
94c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    } catch (Exception ex) {
95c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      if (expectedException == null) {
96c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        System.err.println("ERROR: call failed unexpectedly: "
97c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            + ex.getClass());
98c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        ex.printStackTrace();
99c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      } else {
100c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        if (!expectedException.equals(ex.getClass())) {
101c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          System.err.println("ERROR: incorrect exception: wanted "
102c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers              + expectedException.getName() + ", got "
103c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers              + ex.getClass());
104c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          ex.printStackTrace();
1055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
106c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      }
1075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
108c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
109c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    return result;
110c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  }
1115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
1125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/*
1145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Local class with some fields.
1155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */
1165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoclass SamePackage {
117c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public boolean samePackagePublicBooleanInstanceField = true;
118c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public byte samePackagePublicByteInstanceField = 2;
119c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public char samePackagePublicCharInstanceField = 3;
120c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public short samePackagePublicShortInstanceField = 4;
121c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public int samePackagePublicIntInstanceField = 5;
122c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public long samePackagePublicLongInstanceField = 6;
123c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public float samePackagePublicFloatInstanceField = 7.0f;
124c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public double samePackagePublicDoubleInstanceField = 8.0;
125c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public Object samePackagePublicObjectInstanceField = "9";
126c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
127c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected boolean samePackageProtectedBooleanInstanceField = true;
128c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected byte samePackageProtectedByteInstanceField = 10;
129c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected char samePackageProtectedCharInstanceField = 11;
130c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected short samePackageProtectedShortInstanceField = 12;
131c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected int samePackageProtectedIntInstanceField = 13;
132c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected long samePackageProtectedLongInstanceField = 14;
133c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected float samePackageProtectedFloatInstanceField = 15.0f;
134c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected double samePackageProtectedDoubleInstanceField = 16.0;
135c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected Object samePackageProtectedObjectInstanceField = "17";
136c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
137c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private boolean samePackagePrivateBooleanInstanceField = true;
138c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private byte samePackagePrivateByteInstanceField = 18;
139c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private char samePackagePrivateCharInstanceField = 19;
140c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private short samePackagePrivateShortInstanceField = 20;
141c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private int samePackagePrivateIntInstanceField = 21;
142c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private long samePackagePrivateLongInstanceField = 22;
143c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private float samePackagePrivateFloatInstanceField = 23.0f;
144c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private double samePackagePrivateDoubleInstanceField = 24.0;
145c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private Object samePackagePrivateObjectInstanceField = "25";
146c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
147c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ boolean samePackagePackageBooleanInstanceField = true;
148c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ byte samePackagePackageByteInstanceField = 26;
149c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ char samePackagePackageCharInstanceField = 27;
150c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ short samePackagePackageShortInstanceField = 28;
151c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ int samePackagePackageIntInstanceField = 29;
152c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ long samePackagePackageLongInstanceField = 30;
153c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ float samePackagePackageFloatInstanceField = 31.0f;
154c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ double samePackagePackageDoubleInstanceField = 32.0;
155c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ Object samePackagePackageObjectInstanceField = "33";
156c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
157c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public static boolean samePackagePublicBooleanStaticField = true;
158c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public static byte samePackagePublicByteStaticField = 34;
159c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public static char samePackagePublicCharStaticField = 35;
160c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public static short samePackagePublicShortStaticField = 36;
161c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public static int samePackagePublicIntStaticField = 37;
162c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public static long samePackagePublicLongStaticField = 38;
163c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public static float samePackagePublicFloatStaticField = 39.0f;
164c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public static double samePackagePublicDoubleStaticField = 40.0;
165c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public static Object samePackagePublicObjectStaticField = "41";
166c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
167c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected static boolean samePackageProtectedBooleanStaticField = true;
168c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected static byte samePackageProtectedByteStaticField = 42;
169c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected static char samePackageProtectedCharStaticField = 43;
170c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected static short samePackageProtectedShortStaticField = 44;
171c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected static int samePackageProtectedIntStaticField = 45;
172c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected static long samePackageProtectedLongStaticField = 46;
173c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected static float samePackageProtectedFloatStaticField = 47.0f;
174c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected static double samePackageProtectedDoubleStaticField = 48.0;
175c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  protected static Object samePackageProtectedObjectStaticField = "49";
176c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
177c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private static boolean samePackagePrivateBooleanStaticField = true;
178c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private static byte samePackagePrivateByteStaticField = 50;
179c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private static char samePackagePrivateCharStaticField = 51;
180c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private static short samePackagePrivateShortStaticField = 52;
181c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private static int samePackagePrivateIntStaticField = 53;
182c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private static long samePackagePrivateLongStaticField = 54;
183c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private static float samePackagePrivateFloatStaticField = 55.0f;
184c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private static double samePackagePrivateDoubleStaticField = 56.0;
185c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private static Object samePackagePrivateObjectStaticField = "57";
186c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
187c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ static boolean samePackagePackageBooleanStaticField = true;
188c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ static byte samePackagePackageByteStaticField = 58;
189c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ static char samePackagePackageCharStaticField = 59;
190c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ static short samePackagePackageShortStaticField = 60;
191c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ static int samePackagePackageIntStaticField = 61;
192c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ static long samePackagePackageLongStaticField = 62;
193c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ static float samePackagePackageFloatStaticField = 63.0f;
194c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ static double samePackagePackageDoubleStaticField = 64.0;
195c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /* package */ static Object samePackagePackageObjectStaticField = "65";
19611d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao
19711d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao  public void samePublicMethod() { }
19811d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao  protected void sameProtectedMethod() { }
19911d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao  private void samePrivateMethod() { }
20011d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao  /* package */ void samePackageMethod() { }
2015d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
2025d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
2035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/*
204c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers * This is a sub-class of other.PublicClass, which should be allowed to access
205c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers * the various protected fields declared by other.PublicClass and its parent
206c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers * other.ProtectedClass.
2075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */
208c71f652a50e562d88f6aa1d691285101b8912959Ian Rogersclass SubClass extends PublicClass {
209c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /*
210c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   * Perform the various tests.
211c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   *
212c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   * localInst.getValue() is performed using an instance of Main as the
213c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   * source of the reflection call.  otherInst.getValue() uses a subclass
214c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   * of OtherPackage as the source.
215c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   */
216c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public static void main(String[] args) {
217c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    SubClass subOther = new SubClass();
218c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    subOther.doDirectTests();
219c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    subOther.doReflectionTests();
220c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  }
221c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
222c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private static void check(boolean b) {
223c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    if (!b) {
224c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      throw new Error("Test failed");
2255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
226c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  }
227c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
228c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public void doDirectTests() {
229c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicBooleanInstanceField == true);
230c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicByteInstanceField == 2);
231c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicCharInstanceField == 3);
232c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicShortInstanceField == 4);
233c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicIntInstanceField == 5);
234c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicLongInstanceField == 6);
235c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicFloatInstanceField == 7.0f);
236c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicDoubleInstanceField == 8.0);
237c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicObjectInstanceField == "9");
238c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
239c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedBooleanInstanceField == true);
240c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedByteInstanceField == 10);
241c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedCharInstanceField == 11);
242c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedShortInstanceField == 12);
243c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedIntInstanceField == 13);
244c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedLongInstanceField == 14);
245c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedFloatInstanceField == 15.0f);
246c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedDoubleInstanceField == 16.0);
247c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedObjectInstanceField == "17");
248c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
249c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateBooleanInstanceField == true);
250c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateByteInstanceField == 18);
251c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateCharInstanceField == 19);
252c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateShortInstanceField == 20);
253c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateIntInstanceField == 21);
254c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateLongInstanceField == 22);
255c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateFloatInstanceField == 23.0f);
256c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateDoubleInstanceField == 24.0);
257c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateObjectInstanceField == "25");
258c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
259c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageBooleanInstanceField == true);
260c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageByteInstanceField == 26);
261c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageCharInstanceField == 27);
262c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageShortInstanceField == 28);
263c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageIntInstanceField == 29);
264c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageLongInstanceField == 30);
265c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageFloatInstanceField == 31.0f);
266c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageDoubleInstanceField == 32.0);
267c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageObjectInstanceField == "33");
268c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
269c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicBooleanStaticField == true);
270c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicByteStaticField == 34);
271c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicCharStaticField == 35);
272c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicShortStaticField == 36);
273c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicIntStaticField == 37);
274c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicLongStaticField == 38);
275c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicFloatStaticField == 39.0f);
276c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicDoubleStaticField == 40.0);
277c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassPublicObjectStaticField == "41");
278c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
279c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedBooleanStaticField == true);
280c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedByteStaticField == 42);
281c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedCharStaticField == 43);
282c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedShortStaticField == 44);
283c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedIntStaticField == 45);
284c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedLongStaticField == 46);
285c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedFloatStaticField == 47.0f);
286c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedDoubleStaticField == 48.0);
287c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherProtectedClassProtectedObjectStaticField == "49");
288c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
289c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateBooleanStaticField == true);
290c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateByteStaticField == 50);
291c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateCharStaticField == 51);
292c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateShortStaticField == 52);
293c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateIntStaticField == 53);
294c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateLongStaticField == 54);
295c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateFloatStaticField == 55.0f);
296c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateDoubleStaticField == 56.0);
297c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPrivateObjectStaticField == "57");
298c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
299c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageBooleanStaticField == true);
300c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageByteStaticField == 58);
301c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageCharStaticField == 59);
302c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageShortStaticField == 60);
303c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageIntStaticField == 61);
304c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageLongStaticField == 62);
305c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageFloatStaticField == 63.0f);
306c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageDoubleStaticField == 64.0);
307c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherProtectedClassPackageObjectStaticField == "65");
308c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
309c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicBooleanInstanceField == true);
310c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicByteInstanceField == -2);
311c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicCharInstanceField == (char)-3);
312c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicShortInstanceField == -4);
313c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicIntInstanceField == -5);
314c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicLongInstanceField == -6);
315c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicFloatInstanceField == -7.0f);
316c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicDoubleInstanceField == -8.0);
317c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicObjectInstanceField == "-9");
318c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
319c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedBooleanInstanceField == true);
320c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedByteInstanceField == -10);
321c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedCharInstanceField == (char)-11);
322c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedShortInstanceField == -12);
323c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedIntInstanceField == -13);
324c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedLongInstanceField == -14);
325c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedFloatInstanceField == -15.0f);
326c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedDoubleInstanceField == -16.0);
327c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedObjectInstanceField == "-17");
328c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
329c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateBooleanInstanceField == true);
330c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateByteInstanceField == -18);
331c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateCharInstanceField == (char)-19);
332c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateShortInstanceField == -20);
333c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateIntInstanceField == -21);
334c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateLongInstanceField == -22);
335c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateFloatInstanceField == -23.0f);
336c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateDoubleInstanceField == -24.0);
337c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateObjectInstanceField == "-25");
338c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
339c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageBooleanInstanceField == true);
340c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageByteInstanceField == -26);
341c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageCharInstanceField == (char)-27);
342c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageShortInstanceField == -28);
343c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageIntInstanceField == -29);
344c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageLongInstanceField == -30);
345c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageFloatInstanceField == -31.0f);
346c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageDoubleInstanceField == -32.0);
347c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageObjectInstanceField == "-33");
348c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
349c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicBooleanStaticField == true);
350c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicByteStaticField == -34);
351c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicCharStaticField == (char)-35);
352c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicShortStaticField == -36);
353c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicIntStaticField == -37);
354c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicLongStaticField == -38);
355c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicFloatStaticField == -39.0f);
356c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicDoubleStaticField == -40.0);
357c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassPublicObjectStaticField == "-41");
358c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
359c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedBooleanStaticField == true);
360c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedByteStaticField == -42);
361c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedCharStaticField == (char)-43);
362c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedShortStaticField == -44);
363c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedIntStaticField == -45);
364c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedLongStaticField == -46);
365c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedFloatStaticField == -47.0f);
366c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedDoubleStaticField == -48.0);
367c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(otherPublicClassProtectedObjectStaticField == "-49");
368c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
369c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateBooleanStaticField == true);
370c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateByteStaticField == -50);
371c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateCharStaticField == (char)-51);
372c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateShortStaticField == -52);
373c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateIntStaticField == -53);
374c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateLongStaticField == -54);
375c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateFloatStaticField == -55.0f);
376c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateDoubleStaticField == -56.0);
377c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPrivateObjectStaticField == "-57");
378c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
379c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageBooleanStaticField == true);
380c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageByteStaticField == -58);
381c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageCharStaticField == (char)-59);
382c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageShortStaticField == -60);
383c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageIntStaticField == -61);
384c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageLongStaticField == -62);
385c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageFloatStaticField == -63.0f);
386c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageDoubleStaticField == -64.0);
387c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(otherPublicClassPackageObjectStaticField == "-65");
388c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
389c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    SamePackage s = new SamePackage();
390c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePublicBooleanInstanceField == true);
391c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePublicByteInstanceField == 2);
392c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePublicCharInstanceField == 3);
393c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePublicShortInstanceField == 4);
394c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePublicIntInstanceField == 5);
395c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePublicLongInstanceField == 6);
396c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePublicFloatInstanceField == 7.0f);
397c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePublicDoubleInstanceField == 8.0);
398c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePublicObjectInstanceField == "9");
399c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
400c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackageProtectedBooleanInstanceField == true);
401c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackageProtectedByteInstanceField == 10);
402c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackageProtectedCharInstanceField == 11);
403c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackageProtectedShortInstanceField == 12);
404c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackageProtectedIntInstanceField == 13);
405c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackageProtectedLongInstanceField == 14);
406c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackageProtectedFloatInstanceField == 15.0f);
407c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackageProtectedDoubleInstanceField == 16.0);
408c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackageProtectedObjectInstanceField == "17");
409c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
410c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(s.samePackagePrivateBooleanInstanceField == true);
411c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(s.samePackagePrivateByteInstanceField == 18);
412c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(s.samePackagePrivateCharInstanceField == 19);
413c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(s.samePackagePrivateShortInstanceField == 20);
414c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(s.samePackagePrivateIntInstanceField == 21);
415c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(s.samePackagePrivateLongInstanceField == 22);
416c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(s.samePackagePrivateFloatInstanceField == 23.0f);
417c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(s.samePackagePrivateDoubleInstanceField == 24.0);
418c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(s.samePackagePrivateObjectInstanceField == "25");
419c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
420c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePackageBooleanInstanceField == true);
421c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePackageByteInstanceField == 26);
422c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePackageCharInstanceField == 27);
423c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePackageShortInstanceField == 28);
424c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePackageIntInstanceField == 29);
425c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePackageLongInstanceField == 30);
426c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePackageFloatInstanceField == 31.0f);
427c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePackageDoubleInstanceField == 32.0);
428c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(s.samePackagePackageObjectInstanceField == "33");
429c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
430c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePublicBooleanStaticField == true);
431c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePublicByteStaticField == 34);
432c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePublicCharStaticField == 35);
433c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePublicShortStaticField == 36);
434c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePublicIntStaticField == 37);
435c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePublicLongStaticField == 38);
436c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePublicFloatStaticField == 39.0f);
437c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePublicDoubleStaticField == 40.0);
438c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePublicObjectStaticField == "41");
439c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
440c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackageProtectedBooleanStaticField == true);
441c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackageProtectedByteStaticField == 42);
442c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackageProtectedCharStaticField == 43);
443c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackageProtectedShortStaticField == 44);
444c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackageProtectedIntStaticField == 45);
445c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackageProtectedLongStaticField == 46);
446c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackageProtectedFloatStaticField == 47.0f);
447c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackageProtectedDoubleStaticField == 48.0);
448c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackageProtectedObjectStaticField == "49");
449c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
450c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(SamePackage.samePackagePrivateBooleanStaticField == true);
451c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(SamePackage.samePackagePrivateByteStaticField == 50);
452c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(SamePackage.samePackagePrivateCharStaticField == 51);
453c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(SamePackage.samePackagePrivateShortStaticField == 52);
454c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(SamePackage.samePackagePrivateIntStaticField == 53);
455c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(SamePackage.samePackagePrivateLongStaticField == 54);
456c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(SamePackage.samePackagePrivateFloatStaticField == 55.0f);
457c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(SamePackage.samePackagePrivateDoubleStaticField == 56.0);
458c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    // check(SamePackage.samePackagePrivateObjectStaticField == "57");
459c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
460c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePackageBooleanStaticField == true);
461c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePackageByteStaticField == 58);
462c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePackageCharStaticField == 59);
463c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePackageShortStaticField == 60);
464c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePackageIntStaticField == 61);
465c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePackageLongStaticField == 62);
466c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePackageFloatStaticField == 63.0f);
467c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePackageDoubleStaticField == 64.0);
468c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    check(SamePackage.samePackagePackageObjectStaticField == "65");
469c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  }
470c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
471c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  private static boolean compatibleTypes(char srcType, char dstType) {
472c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    switch (dstType) {
473c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      case 'Z':
474c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      case 'C':
475c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      case 'B':
476c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        return srcType == dstType;
477c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      case 'S':
478c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        return srcType == 'B' || srcType == 'S';
479c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      case 'I':
480c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        return srcType == 'B' || srcType == 'C' || srcType == 'S' || srcType == 'I';
481c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      case 'J':
482c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        return srcType == 'B' || srcType == 'C' || srcType == 'S' || srcType == 'I' ||
483c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        srcType == 'J';
484c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      case 'F':
485c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        return srcType == 'B' || srcType == 'C' || srcType == 'S' || srcType == 'I' ||
486c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        srcType == 'J' || srcType == 'F';
487c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      case 'D':
488c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        return srcType == 'B' || srcType == 'C' || srcType == 'S' || srcType == 'I' ||
489c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        srcType == 'J' || srcType == 'F' || srcType == 'D';
490c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      case 'L':
491c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        return true;
492c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      default:
493c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        throw new Error("Unexpected type char " + dstType);
4945d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
495c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  }
496c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
497c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public void doReflectionTests() {
498c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    String typeChars = "ZBCSIJFDL";
499c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    String fieldNameForTypeChar[] = {
500c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        "Boolean",
501c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        "Byte",
502c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        "Char",
503c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        "Short",
504c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        "Int",
505c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        "Long",
506c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        "Float",
507c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        "Double",
508c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        "Object"
509c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    };
510c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
511c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    Main localInst = new Main();
512c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    SamePackage samePkgInst = new SamePackage();
513c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    PublicClass otherPkgInst = new PublicClass();
514c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    Object plainObj = new Object();
515c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
516c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    for (int round = 0; round < 3; round++) {
517c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      Object validInst;
518c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      Field[] fields;
51911d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao      Method[] methods;
520c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      boolean same_package = false;
52111d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao      boolean protected_class = false;
522c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      switch (round) {
523c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 0:
524c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          validInst = new SamePackage();
525c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          fields = SamePackage.class.getDeclaredFields();
526c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          check(fields.length == 72);
52711d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao          methods = SamePackage.class.getDeclaredMethods();
52811d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao          check(methods.length == 4);
529c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          same_package = true;
530c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
531c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 1:
532c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          validInst = new PublicClass();
533c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          fields = PublicClass.class.getDeclaredFields();
534c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          check(fields.length == 72);
53511d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao          methods = PublicClass.class.getDeclaredMethods();
53611d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao          check(methods.length == 4);
537c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
538c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        default:
539c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          validInst = new PublicClass();
540c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          fields = PublicClass.class.getSuperclass().getDeclaredFields();
541c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          check(fields.length == 72);
54211d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao          methods = PublicClass.class.getSuperclass().getDeclaredMethods();
54311d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao          check(methods.length == 4);
54411d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao          protected_class = true;
545c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
546c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      }
547c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      for (Field f : fields) {
548c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        char typeChar = '?';
549c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        for (int i = 0; i < fieldNameForTypeChar.length; i++) {
550c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          if (f.getName().contains(fieldNameForTypeChar[i])) {
551c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            typeChar = typeChars.charAt(i);
552c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            break;
553c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          }
554c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        }
555c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        // Check access or lack of to field.
556c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        Class<?> subClassAccessExceptionClass = null;
557925b687c29ddfe952c29e13e6c05c2491e3b37f7Jeff Hao        if ((f.getName().contains("Private") ||
55811d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao            (!same_package && f.getName().contains("Package")) ||
559925b687c29ddfe952c29e13e6c05c2491e3b37f7Jeff Hao            (!same_package && f.getName().contains("Protected"))) &&
560925b687c29ddfe952c29e13e6c05c2491e3b37f7Jeff Hao            !(protected_class && f.getName().contains("Public"))) {
56111d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao          subClassAccessExceptionClass = IllegalAccessException.class;
562c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        }
563c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        Class<?> mainClassAccessExceptionClass = null;
564925b687c29ddfe952c29e13e6c05c2491e3b37f7Jeff Hao        if ((f.getName().contains("Private") ||
565c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            (!same_package && f.getName().contains("Package")) ||
566925b687c29ddfe952c29e13e6c05c2491e3b37f7Jeff Hao            (!same_package && f.getName().contains("Protected"))) &&
567925b687c29ddfe952c29e13e6c05c2491e3b37f7Jeff Hao            !(protected_class && f.getName().contains("Public"))) {
56811d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao          mainClassAccessExceptionClass = IllegalAccessException.class;
569c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        }
5705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
571c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        this.getValue(f, validInst, typeChar, subClassAccessExceptionClass);
572c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        localInst.getValue(f, validInst, typeChar, mainClassAccessExceptionClass);
573c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
574c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        // Check things that can get beyond the IllegalAccessException.
575c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        if (subClassAccessExceptionClass == null) {
576c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          // Check NPE.
577c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          Class<?> npeClass = null;
578c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          if (!f.getName().contains("Static")) {
579c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            npeClass = NullPointerException.class;
580c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          }
581c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
582c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          this.getValue(f, null, typeChar, npeClass);
583c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          if (mainClassAccessExceptionClass == null) {
584c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            localInst.getValue(f, null, typeChar, npeClass);
585c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          }
586c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
587c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          // Check access of wrong field type for valid instance.
588c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          for (int i = 0; i < typeChars.length(); i++) {
589c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            char otherChar = typeChars.charAt(i);
590c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            Class<?> illArgClass = compatibleTypes(typeChar, otherChar) ?
591c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers                null : IllegalArgumentException.class;
592c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            this.getValue(f, validInst, otherChar, illArgClass);
593c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            if (mainClassAccessExceptionClass == null) {
594c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers              localInst.getValue(f, validInst, otherChar, illArgClass);
5955d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
596c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          }
5975d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
598c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          if (!f.getName().contains("Static")) {
599c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            // Wrong object.
600c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            this.getValue(f, plainObj, typeChar, IllegalArgumentException.class);
601c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            if (mainClassAccessExceptionClass == null) {
602c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers              localInst.getValue(f, plainObj, typeChar, IllegalArgumentException.class);
6035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
604c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          }
6055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
606c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      }
60711d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao
60811d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao      for (Method m : methods) {
60911d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao        Class<?> subClassAccessExceptionClass = null;
610925b687c29ddfe952c29e13e6c05c2491e3b37f7Jeff Hao        if (m.getName().contains("Private") ||
61111d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao            (!same_package && m.getName().contains("Package")) ||
61211d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao            (!same_package && m.getName().contains("Protected"))) {
61311d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao          subClassAccessExceptionClass = IllegalAccessException.class;
61411d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao        }
61511d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao        this.invoke(m, validInst, subClassAccessExceptionClass);
61611d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao      }
617c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    }
618c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    System.out.println("good");
619c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  }
620c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
621c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  /*
622c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   * [this is a clone of Main.getValue() -- the class issuing the
623c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   * reflection call is significant]
624c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers   */
625c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  public Object getValue(Field field, Object obj, char type,
626c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      Class expectedException) {
627c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    Object result = null;
628c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    try {
629c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      switch (type) {
630c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'Z':
631c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getBoolean(obj);
632c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
633c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'B':
634c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getByte(obj);
635c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
636c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'S':
637c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getShort(obj);
638c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
639c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'C':
640c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getChar(obj);
641c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
642c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'I':
643c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getInt(obj);
644c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
645c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'J':
646c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getLong(obj);
647c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
648c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'F':
649c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getFloat(obj);
650c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
651c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'D':
652c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.getDouble(obj);
653c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
654c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        case 'L':
655c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          result = field.get(obj);
656c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          break;
657c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        default:
658c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          throw new RuntimeException("bad type '" + type + "'");
659c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      }
660c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers
661c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      /* success; expected? */
662c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      if (expectedException != null) {
663c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        System.err.println("ERROR: call succeeded for field " + field +
664c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            " with a read of type '" + type +
665c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            "', was expecting " + expectedException);
666c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        Thread.dumpStack();
667c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      }
668c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    } catch (Exception ex) {
669c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      if (expectedException == null) {
670c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        System.err.println("ERROR: call failed unexpectedly: "
671c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers            + ex.getClass());
672c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        ex.printStackTrace();
673c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      } else {
674c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        if (!expectedException.equals(ex.getClass())) {
675c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          System.err.println("ERROR: incorrect exception: wanted "
676c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers              + expectedException.getName() + ", got "
677c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers              + ex.getClass());
678c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers          ex.printStackTrace();
679c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers        }
680c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers      }
6815d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
6825d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
683c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers    return result;
684c71f652a50e562d88f6aa1d691285101b8912959Ian Rogers  }
68511d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao
68611d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao  public Object invoke(Method method, Object obj, Class expectedException) {
68711d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao    Object result = null;
68811d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao    try {
68911d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao      result = method.invoke(obj);
69011d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao      /* success; expected? */
69111d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao      if (expectedException != null) {
69211d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao        System.err.println("ERROR: call succeeded for method " + method + "', was expecting " +
69311d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao                           expectedException);
69411d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao        Thread.dumpStack();
69511d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao      }
69611d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao    } catch (Exception ex) {
69711d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao      if (expectedException == null) {
69811d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao        System.err.println("ERROR: call failed unexpectedly: " + ex.getClass());
69911d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao        ex.printStackTrace();
70011d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao      } else {
70111d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao        if (!expectedException.equals(ex.getClass())) {
70211d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao          System.err.println("ERROR: incorrect exception: wanted " + expectedException.getName() +
70311d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao                             ", got " + ex.getClass());
70411d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao          ex.printStackTrace();
70511d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao        }
70611d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao      }
70711d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao    }
70811d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao    return result;
70911d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao  }
7105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
711