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