197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes/* 297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * Copyright (C) 2010 Google Inc. 397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * 497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * you may not use this file except in compliance with the License. 697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * You may obtain a copy of the License at 797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * 897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * 1097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * Unless required by applicable law or agreed to in writing, software 1197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 1297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * See the License for the specific language governing permissions and 1497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * limitations under the License. 1597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes */ 1697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 1797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughespackage benchmarks.regression; 1897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 19ea13f8291a92b6f47f50011da1d5e8c107984bc3Paul Duffinimport java.lang.reflect.Constructor; 20ea13f8291a92b6f47f50011da1d5e8c107984bc3Paul Duffinimport java.lang.reflect.Field; 21ea13f8291a92b6f47f50011da1d5e8c107984bc3Paul Duffinimport java.lang.reflect.Method; 2297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 23ea13f8291a92b6f47f50011da1d5e8c107984bc3Paul Duffinpublic class ReflectionBenchmark { 2497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeObject_getClass(int reps) throws Exception { 2597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes C c = new C(); 2697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 2797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes c.getClass(); 2897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 2997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 3097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 3197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeClass_getField(int reps) throws Exception { 3297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Class<?> klass = C.class; 3397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 3497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes klass.getField("f"); 3597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 3697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 3797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 3897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeClass_getDeclaredField(int reps) throws Exception { 3997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Class<?> klass = C.class; 4097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 4197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes klass.getDeclaredField("f"); 4297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 4397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 4497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 4597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeClass_getConstructor(int reps) throws Exception { 4697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Class<?> klass = C.class; 4797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 4897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes klass.getConstructor(); 4997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 5097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 5197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 5297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeClass_newInstance(int reps) throws Exception { 5397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Class<?> klass = C.class; 5497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Constructor constructor = klass.getConstructor(); 5597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 5697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes constructor.newInstance(); 5797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 5897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 5997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 6097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeClass_getMethod(int reps) throws Exception { 6197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Class<?> klass = C.class; 6297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 6397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes klass.getMethod("m"); 6497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 6597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 6697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 6797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeClass_getDeclaredMethod(int reps) throws Exception { 6897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Class<?> klass = C.class; 6997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 7097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes klass.getDeclaredMethod("m"); 7197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 7297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 7397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 7497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeField_setInt(int reps) throws Exception { 7597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Class<?> klass = C.class; 7697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Field f = klass.getDeclaredField("f"); 7797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes C instance = new C(); 7897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 7997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes f.setInt(instance, 1); 8097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 8197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 8297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 8397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeField_getInt(int reps) throws Exception { 8497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Class<?> klass = C.class; 8597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Field f = klass.getDeclaredField("f"); 8697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes C instance = new C(); 8797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 8897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes f.getInt(instance); 8997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 9097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 9197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 9297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeMethod_invokeV(int reps) throws Exception { 9397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Class<?> klass = C.class; 9497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Method m = klass.getDeclaredMethod("m"); 9597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes C instance = new C(); 9697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 9797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes m.invoke(instance); 9897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 9997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 10097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 10197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeMethod_invokeStaticV(int reps) throws Exception { 10297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Class<?> klass = C.class; 10397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Method m = klass.getDeclaredMethod("sm"); 10497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 10597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes m.invoke(null); 10697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 10797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 10897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 10997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeMethod_invokeI(int reps) throws Exception { 11097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Class<?> klass = C.class; 11197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Method m = klass.getDeclaredMethod("setField", int.class); 11297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes C instance = new C(); 11397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 11497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes m.invoke(instance, 1); 11597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 11697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 11797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 11897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeMethod_invokePreBoxedI(int reps) throws Exception { 11997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Class<?> klass = C.class; 12097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Method m = klass.getDeclaredMethod("setField", int.class); 12197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes C instance = new C(); 12297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Integer one = Integer.valueOf(1); 12397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 12497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes m.invoke(instance, one); 12597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 12697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 12797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 12897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeMethod_invokeStaticI(int reps) throws Exception { 12997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Class<?> klass = C.class; 13097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Method m = klass.getDeclaredMethod("setStaticField", int.class); 13197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 13297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes m.invoke(null, 1); 13397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 13497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 13597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 13697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeMethod_invokeStaticPreBoxedI(int reps) throws Exception { 13797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Class<?> klass = C.class; 13897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Method m = klass.getDeclaredMethod("setStaticField", int.class); 13997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Integer one = Integer.valueOf(1); 14097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 14197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes m.invoke(null, one); 14297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 14397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 14497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 14597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeRegularMethodInvocation(int reps) throws Exception { 14697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes C instance = new C(); 14797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 14897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes instance.setField(1); 14997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 15097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 15197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 15297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeRegularConstructor(int reps) throws Exception { 15397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int rep = 0; rep < reps; ++rep) { 15497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes new C(); 15597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 15697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 15797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 1582abeaa62bbba16960e3d824745b77705478f8450Mathieu Chartier public void timeClass_classNewInstance(int reps) throws Exception { 1592abeaa62bbba16960e3d824745b77705478f8450Mathieu Chartier Class<?> klass = C.class; 1602abeaa62bbba16960e3d824745b77705478f8450Mathieu Chartier for (int rep = 0; rep < reps; ++rep) { 1612abeaa62bbba16960e3d824745b77705478f8450Mathieu Chartier klass.newInstance(); 1622abeaa62bbba16960e3d824745b77705478f8450Mathieu Chartier } 1632abeaa62bbba16960e3d824745b77705478f8450Mathieu Chartier } 1642abeaa62bbba16960e3d824745b77705478f8450Mathieu Chartier 165bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao public void timeClass_isInstance(int reps) throws Exception { 166bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao D d = new D(); 167bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao Class<?> klass = IC.class; 168bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao for (int rep = 0; rep < reps; ++rep) { 169bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao klass.isInstance(d); 170bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao } 171bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao } 172bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao 1736d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath public void timeGetInstanceField(int reps) throws Exception { 1746d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath for (int rep = 0; rep < reps; ++rep) { 1756d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath // The field here (and in timeGetStaticField) were chosen to be 1766d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath // ~75% down the bottom of the alphabetically sorted field list. 1776d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath // It's hard to construct a "fair" test case without resorting to 1786d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath // a class whose field names are created algorithmically. 1796d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath // 1806d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath // TODO: Write a test script that generates both the classes we're 1816d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath // reflecting on and the test case for each of its fields. 1826d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath R.class.getField("mtextAppearanceLargePopupMenu"); 1836d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath } 1846d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath } 1856d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath 1866d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath public void timeGetStaticField(int reps) throws Exception { 1876d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath for (int rep = 0; rep < reps; ++rep) { 1886d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath R.class.getField("weekNumberColor"); 1896d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath } 1906d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath } 1916d934bca6d9de3609966f6c91c4ecb88afd44946Narayan Kamath 192b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light public void timeGetInterfaceStaticField(int reps) throws Exception { 193b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light for (int rep = 0; rep < reps; ++rep) { 194b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light F.class.getField("sf"); 195b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light } 196b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light } 197b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light 198b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light public void timeGetSuperClassField(int reps) throws Exception { 199b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light for (int rep = 0; rep < reps; ++rep) { 200b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light G.class.getField("f"); 201b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light } 202b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light } 203b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light 204b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light 20597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public static class C { 20697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public static int sf = 0; 20797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public int f = 0; 20897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 20997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public C() { 21097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes // A non-empty constructor so we don't get optimized away. 21197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes f = 1; 21297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 21397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 21497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void m() { 21597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 21697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 21797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public static void sm() { 21897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 21997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 22097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void setField(int value) { 22197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes f = value; 22297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 22397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 22497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public static void setStaticField(int value) { 22597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes sf = value; 22697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 22797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 228bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao 229bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao interface IA { 230bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao } 231bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao 232bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao interface IB extends IA { 233bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao } 234bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao 235bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao interface IC extends IB { 236b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light public static final int sf = 0; 237bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao } 238bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao 239bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao class D implements IC { 240bf7fbb333d94d27f6fa68fd45d27ebc9c4e685e1Jeff Hao } 241b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light 242b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light class E extends D { 243b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light } 244b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light 245b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light class F extends E implements IB { 246b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light } 247b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light 248b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light class G extends C { 249b7b17db2c5dcc46a5112ab883fe2c64f8e16e5e8Alex Light } 25097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes} 251