xref: /aosp_15_r20/art/test/121-modifiers/src2/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2014 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 public class Main {
18*795d594fSAndroid Build Coastguard Worker   public final static int INTERFACE_DEFINED_BITS =
19*795d594fSAndroid Build Coastguard Worker       0x0001 |  // public, may be set.
20*795d594fSAndroid Build Coastguard Worker       0x0002 |  // private, may be flagged by inner class.
21*795d594fSAndroid Build Coastguard Worker       0x0004 |  // protected, may be flagged by inner class.
22*795d594fSAndroid Build Coastguard Worker       0x0008 |  // static, may be flagged by inner class.
23*795d594fSAndroid Build Coastguard Worker       0x0010 |  // final, must not be set.
24*795d594fSAndroid Build Coastguard Worker       0x0020 |  // super, must not be set.
25*795d594fSAndroid Build Coastguard Worker       0x0200 |  // interface, must be set.
26*795d594fSAndroid Build Coastguard Worker       0x0400 |  // abstract, must be set.
27*795d594fSAndroid Build Coastguard Worker       0x1000 |  // synthetic, may be set.
28*795d594fSAndroid Build Coastguard Worker       0x2000 |  // annotation, may be set (annotation implies interface)
29*795d594fSAndroid Build Coastguard Worker       0x4000 ;  // enum, must not be set.
30*795d594fSAndroid Build Coastguard Worker 
31*795d594fSAndroid Build Coastguard Worker   public final static int CLASS_DEFINED_BITS =
32*795d594fSAndroid Build Coastguard Worker       0x0001 |  // public, may be set.
33*795d594fSAndroid Build Coastguard Worker       0x0002 |  // private, may be flagged by inner class.
34*795d594fSAndroid Build Coastguard Worker       0x0004 |  // protected, may be flagged by inner class.
35*795d594fSAndroid Build Coastguard Worker       0x0008 |  // static, may be flagged by inner class.
36*795d594fSAndroid Build Coastguard Worker       0x0010 |  // final, may be set.
37*795d594fSAndroid Build Coastguard Worker       0x0020 |  // super, may be set.
38*795d594fSAndroid Build Coastguard Worker       0x0200 |  // interface, must not be set.
39*795d594fSAndroid Build Coastguard Worker       0x0400 |  // abstract, may be set.
40*795d594fSAndroid Build Coastguard Worker       0x1000 |  // synthetic, may be set.
41*795d594fSAndroid Build Coastguard Worker       0x2000 |  // annotation, must not be set.
42*795d594fSAndroid Build Coastguard Worker       0x4000 ;  // enum, may be set.
43*795d594fSAndroid Build Coastguard Worker 
44*795d594fSAndroid Build Coastguard Worker   public final static int FIELD_DEFINED_BITS =
45*795d594fSAndroid Build Coastguard Worker        0x0001 |  // public
46*795d594fSAndroid Build Coastguard Worker        0x0002 |  // private
47*795d594fSAndroid Build Coastguard Worker        0x0004 |  // protected
48*795d594fSAndroid Build Coastguard Worker        0x0008 |  // static
49*795d594fSAndroid Build Coastguard Worker        0x0010 |  // final
50*795d594fSAndroid Build Coastguard Worker        0x0040 |  // volatile
51*795d594fSAndroid Build Coastguard Worker        0x0080 |  // transient
52*795d594fSAndroid Build Coastguard Worker        0x1000 |  // synthetic
53*795d594fSAndroid Build Coastguard Worker        0x4000 ;  // enum
54*795d594fSAndroid Build Coastguard Worker 
55*795d594fSAndroid Build Coastguard Worker   public final static int METHOD_DEFINED_BITS =
56*795d594fSAndroid Build Coastguard Worker        0x0001 |  // public
57*795d594fSAndroid Build Coastguard Worker        0x0002 |  // private
58*795d594fSAndroid Build Coastguard Worker        0x0004 |  // protected
59*795d594fSAndroid Build Coastguard Worker        0x0008 |  // static
60*795d594fSAndroid Build Coastguard Worker        0x0010 |  // final
61*795d594fSAndroid Build Coastguard Worker        0x0020 |  // synchronized
62*795d594fSAndroid Build Coastguard Worker        0x0040 |  // bridge
63*795d594fSAndroid Build Coastguard Worker        0x0080 |  // varargs
64*795d594fSAndroid Build Coastguard Worker        0x0100 |  // native
65*795d594fSAndroid Build Coastguard Worker        0x0400 |  // abstract
66*795d594fSAndroid Build Coastguard Worker        0x0800 |  // strictfp
67*795d594fSAndroid Build Coastguard Worker        0x1000 ;  // synthetic
68*795d594fSAndroid Build Coastguard Worker 
main(String args[])69*795d594fSAndroid Build Coastguard Worker   public static void main(String args[]) throws Exception {
70*795d594fSAndroid Build Coastguard Worker     check("Inf");
71*795d594fSAndroid Build Coastguard Worker     check("NonInf");
72*795d594fSAndroid Build Coastguard Worker     check("A");
73*795d594fSAndroid Build Coastguard Worker     check("A$B");
74*795d594fSAndroid Build Coastguard Worker   }
75*795d594fSAndroid Build Coastguard Worker 
check(String className)76*795d594fSAndroid Build Coastguard Worker   private static void check(String className) throws Exception {
77*795d594fSAndroid Build Coastguard Worker     Class<?> clazz = Class.forName(className);
78*795d594fSAndroid Build Coastguard Worker     if (className.equals("Inf")) {
79*795d594fSAndroid Build Coastguard Worker       if (!clazz.isInterface()) {
80*795d594fSAndroid Build Coastguard Worker         throw new RuntimeException("Expected an interface.");
81*795d594fSAndroid Build Coastguard Worker       }
82*795d594fSAndroid Build Coastguard Worker       int undefinedBits = 0xFFFF ^ INTERFACE_DEFINED_BITS;
83*795d594fSAndroid Build Coastguard Worker       if ((clazz.getModifiers() & undefinedBits) != 0) {
84*795d594fSAndroid Build Coastguard Worker         System.out.println("Clazz.getModifiers(): " + Integer.toBinaryString(clazz.getModifiers()));
85*795d594fSAndroid Build Coastguard Worker         System.out.println("INTERFACE_DEF_BITS: " + Integer.toBinaryString(INTERFACE_DEFINED_BITS));
86*795d594fSAndroid Build Coastguard Worker         throw new RuntimeException("Undefined bits for an interface: " + className);
87*795d594fSAndroid Build Coastguard Worker       }
88*795d594fSAndroid Build Coastguard Worker     } else {
89*795d594fSAndroid Build Coastguard Worker       if (clazz.isInterface()) {
90*795d594fSAndroid Build Coastguard Worker         throw new RuntimeException("Expected a class.");
91*795d594fSAndroid Build Coastguard Worker       }
92*795d594fSAndroid Build Coastguard Worker       int undefinedBits = 0xFFFF ^ CLASS_DEFINED_BITS;
93*795d594fSAndroid Build Coastguard Worker       if ((clazz.getModifiers() & undefinedBits) != 0) {
94*795d594fSAndroid Build Coastguard Worker         System.out.println("Clazz.getModifiers(): " + Integer.toBinaryString(clazz.getModifiers()));
95*795d594fSAndroid Build Coastguard Worker         System.out.println("CLASS_DEF_BITS: " + Integer.toBinaryString(CLASS_DEFINED_BITS));
96*795d594fSAndroid Build Coastguard Worker         throw new RuntimeException("Undefined bits for a class: " + className);
97*795d594fSAndroid Build Coastguard Worker       }
98*795d594fSAndroid Build Coastguard Worker     }
99*795d594fSAndroid Build Coastguard Worker 
100*795d594fSAndroid Build Coastguard Worker     // Check fields.
101*795d594fSAndroid Build Coastguard Worker     for (java.lang.reflect.Field f : clazz.getDeclaredFields()) {
102*795d594fSAndroid Build Coastguard Worker       String name = f.getName();
103*795d594fSAndroid Build Coastguard Worker       int undefinedBits = 0xFFFF ^ FIELD_DEFINED_BITS;
104*795d594fSAndroid Build Coastguard Worker       if ((f.getModifiers() & undefinedBits) != 0) {
105*795d594fSAndroid Build Coastguard Worker         System.out.println("f.getModifiers(): " + Integer.toBinaryString(f.getModifiers()));
106*795d594fSAndroid Build Coastguard Worker         System.out.println("FIELD_DEF_BITS: " + Integer.toBinaryString(FIELD_DEFINED_BITS));
107*795d594fSAndroid Build Coastguard Worker         throw new RuntimeException("Unexpected field bits: " + name);
108*795d594fSAndroid Build Coastguard Worker       }
109*795d594fSAndroid Build Coastguard Worker       if (name.equals("I")) {
110*795d594fSAndroid Build Coastguard Worker         // Interface field, just check generically.
111*795d594fSAndroid Build Coastguard Worker       } else {
112*795d594fSAndroid Build Coastguard Worker         // Check the name, see that the corresponding bit is set.
113*795d594fSAndroid Build Coastguard Worker         int bitmask = getFieldMask(name);
114*795d594fSAndroid Build Coastguard Worker         if ((bitmask & f.getModifiers()) == 0) {
115*795d594fSAndroid Build Coastguard Worker           throw new RuntimeException("Expected field bit not set.");
116*795d594fSAndroid Build Coastguard Worker         }
117*795d594fSAndroid Build Coastguard Worker       }
118*795d594fSAndroid Build Coastguard Worker     }
119*795d594fSAndroid Build Coastguard Worker 
120*795d594fSAndroid Build Coastguard Worker     // Check methods.
121*795d594fSAndroid Build Coastguard Worker     for (java.lang.reflect.Method m : clazz.getDeclaredMethods()) {
122*795d594fSAndroid Build Coastguard Worker       String name = m.getName();
123*795d594fSAndroid Build Coastguard Worker       int undefinedBits = 0xFFFF ^ METHOD_DEFINED_BITS;
124*795d594fSAndroid Build Coastguard Worker       if ((m.getModifiers() & undefinedBits) != 0) {
125*795d594fSAndroid Build Coastguard Worker           System.out.println("m.getModifiers(): " + Integer.toBinaryString(m.getModifiers()));
126*795d594fSAndroid Build Coastguard Worker           System.out.println("METHOD_DEF_BITS: " + Integer.toBinaryString(METHOD_DEFINED_BITS));
127*795d594fSAndroid Build Coastguard Worker         throw new RuntimeException("Unexpected method bits: " + name);
128*795d594fSAndroid Build Coastguard Worker       }
129*795d594fSAndroid Build Coastguard Worker       // Check the name, see that the corresponding bit is set.
130*795d594fSAndroid Build Coastguard Worker       int bitmask = getMethodMask(name);
131*795d594fSAndroid Build Coastguard Worker       if ((bitmask & m.getModifiers()) == 0) {
132*795d594fSAndroid Build Coastguard Worker         throw new RuntimeException("Expected method bit not set.");
133*795d594fSAndroid Build Coastguard Worker       }
134*795d594fSAndroid Build Coastguard Worker     }
135*795d594fSAndroid Build Coastguard Worker   }
136*795d594fSAndroid Build Coastguard Worker 
getFieldMask(String name)137*795d594fSAndroid Build Coastguard Worker   private static int getFieldMask(String name) {
138*795d594fSAndroid Build Coastguard Worker     int index = name.indexOf("Field");
139*795d594fSAndroid Build Coastguard Worker     if (index > 0) {
140*795d594fSAndroid Build Coastguard Worker       String shortS = name.substring(0, index);
141*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("public")) {
142*795d594fSAndroid Build Coastguard Worker         return 0x0001;
143*795d594fSAndroid Build Coastguard Worker       }
144*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("private")) {
145*795d594fSAndroid Build Coastguard Worker         return 0x0002;
146*795d594fSAndroid Build Coastguard Worker       }
147*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("protected")) {
148*795d594fSAndroid Build Coastguard Worker         return 0x0004;
149*795d594fSAndroid Build Coastguard Worker       }
150*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("static")) {
151*795d594fSAndroid Build Coastguard Worker         return 0x0008;
152*795d594fSAndroid Build Coastguard Worker       }
153*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("transient")) {
154*795d594fSAndroid Build Coastguard Worker         return 0x0080;
155*795d594fSAndroid Build Coastguard Worker       }
156*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("volatile")) {
157*795d594fSAndroid Build Coastguard Worker         return 0x0040;
158*795d594fSAndroid Build Coastguard Worker       }
159*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("final")) {
160*795d594fSAndroid Build Coastguard Worker         return 0x0010;
161*795d594fSAndroid Build Coastguard Worker       }
162*795d594fSAndroid Build Coastguard Worker     }
163*795d594fSAndroid Build Coastguard Worker     throw new RuntimeException("Unexpected field name " + name);
164*795d594fSAndroid Build Coastguard Worker   }
165*795d594fSAndroid Build Coastguard Worker 
getMethodMask(String name)166*795d594fSAndroid Build Coastguard Worker   private static int getMethodMask(String name) {
167*795d594fSAndroid Build Coastguard Worker     int index = name.indexOf("Method");
168*795d594fSAndroid Build Coastguard Worker     if (index > 0) {
169*795d594fSAndroid Build Coastguard Worker       String shortS = name.substring(0, index);
170*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("public")) {
171*795d594fSAndroid Build Coastguard Worker         return 0x0001;
172*795d594fSAndroid Build Coastguard Worker       }
173*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("private")) {
174*795d594fSAndroid Build Coastguard Worker         return 0x0002;
175*795d594fSAndroid Build Coastguard Worker       }
176*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("protected")) {
177*795d594fSAndroid Build Coastguard Worker         return 0x0004;
178*795d594fSAndroid Build Coastguard Worker       }
179*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("static")) {
180*795d594fSAndroid Build Coastguard Worker         return 0x0008;
181*795d594fSAndroid Build Coastguard Worker       }
182*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("synchronized")) {
183*795d594fSAndroid Build Coastguard Worker         return 0x0020;
184*795d594fSAndroid Build Coastguard Worker       }
185*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("varargs")) {
186*795d594fSAndroid Build Coastguard Worker         return 0x0080;
187*795d594fSAndroid Build Coastguard Worker       }
188*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("final")) {
189*795d594fSAndroid Build Coastguard Worker         return 0x0010;
190*795d594fSAndroid Build Coastguard Worker       }
191*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("native")) {
192*795d594fSAndroid Build Coastguard Worker         return 0x0100;
193*795d594fSAndroid Build Coastguard Worker       }
194*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("abstract")) {
195*795d594fSAndroid Build Coastguard Worker         return 0x0400;
196*795d594fSAndroid Build Coastguard Worker       }
197*795d594fSAndroid Build Coastguard Worker       if (shortS.equals("strictfp")) {
198*795d594fSAndroid Build Coastguard Worker         return 0x0800;
199*795d594fSAndroid Build Coastguard Worker       }
200*795d594fSAndroid Build Coastguard Worker     }
201*795d594fSAndroid Build Coastguard Worker     throw new RuntimeException("Unexpected method name " + name);
202*795d594fSAndroid Build Coastguard Worker   }
203*795d594fSAndroid Build Coastguard Worker }
204