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