1 /*
2 * Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.lang.reflect;
27
28 import java.util.StringJoiner;
29
30 /**
31 * The Modifier class provides {@code static} methods and
32 * constants to decode class and member access modifiers. The sets of
33 * modifiers are represented as integers with distinct bit positions
34 * representing different modifiers. The values for the constants
35 * representing the modifiers are taken from the tables in sections
36 * {@jvms 4.1}, {@jvms 4.4}, {@jvms 4.5}, and {@jvms 4.7} of
37 * <cite>The Java Virtual Machine Specification</cite>.
38 *
39 * @see Class#getModifiers()
40 * @see Member#getModifiers()
41 *
42 * @author Nakul Saraiya
43 * @author Kenneth Russell
44 * @since 1.1
45 */
46 public class Modifier {
47 /**
48 * Do not call.
49 */
50 private Modifier() {throw new AssertionError();}
51
52
53 /**
54 * Return {@code true} if the integer argument includes the
55 * {@code public} modifier, {@code false} otherwise.
56 *
57 * @param mod a set of modifiers
58 * @return {@code true} if {@code mod} includes the
97 public static boolean isStatic(int mod) {
98 return (mod & STATIC) != 0;
99 }
100
101 /**
102 * Return {@code true} if the integer argument includes the
103 * {@code final} modifier, {@code false} otherwise.
104 *
105 * @param mod a set of modifiers
106 * @return {@code true} if {@code mod} includes the
107 * {@code final} modifier; {@code false} otherwise.
108 */
109 public static boolean isFinal(int mod) {
110 return (mod & FINAL) != 0;
111 }
112
113 /**
114 * Return {@code true} if the integer argument includes the
115 * {@code synchronized} modifier, {@code false} otherwise.
116 *
117 * @param mod a set of modifiers
118 * @return {@code true} if {@code mod} includes the
119 * {@code synchronized} modifier; {@code false} otherwise.
120 */
121 public static boolean isSynchronized(int mod) {
122 return (mod & SYNCHRONIZED) != 0;
123 }
124
125 /**
126 * Return {@code true} if the integer argument includes the
127 * {@code volatile} modifier, {@code false} otherwise.
128 *
129 * @param mod a set of modifiers
130 * @return {@code true} if {@code mod} includes the
131 * {@code volatile} modifier; {@code false} otherwise.
132 */
133 public static boolean isVolatile(int mod) {
134 return (mod & VOLATILE) != 0;
135 }
136
137 /**
138 * Return {@code true} if the integer argument includes the
139 * {@code transient} modifier, {@code false} otherwise.
140 *
141 * @param mod a set of modifiers
142 * @return {@code true} if {@code mod} includes the
143 * {@code transient} modifier; {@code false} otherwise.
144 */
145 public static boolean isTransient(int mod) {
146 return (mod & TRANSIENT) != 0;
147 }
148
149 /**
150 * Return {@code true} if the integer argument includes the
151 * {@code native} modifier, {@code false} otherwise.
152 *
153 * @param mod a set of modifiers
154 * @return {@code true} if {@code mod} includes the
155 * {@code native} modifier; {@code false} otherwise.
156 */
276 * The {@code int} value representing the {@code static}
277 * modifier.
278 * @see AccessFlag#STATIC
279 */
280 public static final int STATIC = 0x00000008;
281
282 /**
283 * The {@code int} value representing the {@code final}
284 * modifier.
285 * @see AccessFlag#FINAL
286 */
287 public static final int FINAL = 0x00000010;
288
289 /**
290 * The {@code int} value representing the {@code synchronized}
291 * modifier.
292 * @see AccessFlag#SYNCHRONIZED
293 */
294 public static final int SYNCHRONIZED = 0x00000020;
295
296 /**
297 * The {@code int} value representing the {@code volatile}
298 * modifier.
299 * @see AccessFlag#VOLATILE
300 */
301 public static final int VOLATILE = 0x00000040;
302
303 /**
304 * The {@code int} value representing the {@code transient}
305 * modifier.
306 * @see AccessFlag#TRANSIENT
307 */
308 public static final int TRANSIENT = 0x00000080;
309
310 /**
311 * The {@code int} value representing the {@code native}
312 * modifier.
313 * @see AccessFlag#NATIVE
314 */
315 public static final int NATIVE = 0x00000100;
353 return (mod & MANDATED) != 0;
354 }
355
356 // Note on the FOO_MODIFIERS fields and fooModifiers() methods:
357 // the sets of modifiers are not guaranteed to be constants
358 // across time and Java SE releases. Therefore, it would not be
359 // appropriate to expose an external interface to this information
360 // that would allow the values to be treated as Java-level
361 // constants since the values could be constant folded and updates
362 // to the sets of modifiers missed. Thus, the fooModifiers()
363 // methods return an unchanging values for a given release, but a
364 // value that can potentially change over time.
365
366 /**
367 * The Java source modifiers that can be applied to a class.
368 * @jls 8.1.1 Class Modifiers
369 */
370 private static final int CLASS_MODIFIERS =
371 Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE |
372 Modifier.ABSTRACT | Modifier.STATIC | Modifier.FINAL |
373 Modifier.STRICT;
374
375 /**
376 * The Java source modifiers that can be applied to an interface.
377 * @jls 9.1.1 Interface Modifiers
378 */
379 private static final int INTERFACE_MODIFIERS =
380 Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE |
381 Modifier.ABSTRACT | Modifier.STATIC | Modifier.STRICT;
382
383
384 /**
385 * The Java source modifiers that can be applied to a constructor.
386 * @jls 8.8.3 Constructor Modifiers
387 */
388 private static final int CONSTRUCTOR_MODIFIERS =
389 Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE;
390
391 /**
392 * The Java source modifiers that can be applied to a method.
|
1 /*
2 * Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.lang.reflect;
27
28 import java.util.StringJoiner;
29
30 /**
31 * The Modifier class provides {@code static} methods and
32 * constants to decode class and member access modifiers.
33 * The {@link AccessFlag} class should be used instead of this class.
34 * The sets of modifiers are represented as integers with non-distinct bit positions
35 * representing different modifiers. The values for the constants
36 * representing the modifiers are taken from the tables in sections
37 * {@jvms 4.1}, {@jvms 4.4}, {@jvms 4.5}, and {@jvms 4.7} of
38 * <cite>The Java Virtual Machine Specification</cite>.
39 *
40 * @see Class#accessFlags()
41 * @see Member#accessFlags()
42 * @see Class#getModifiers()
43 * @see Member#getModifiers()
44 *
45 * @author Nakul Saraiya
46 * @author Kenneth Russell
47 * @since 1.1
48 */
49 public class Modifier {
50 /**
51 * Do not call.
52 */
53 private Modifier() {throw new AssertionError();}
54
55
56 /**
57 * Return {@code true} if the integer argument includes the
58 * {@code public} modifier, {@code false} otherwise.
59 *
60 * @param mod a set of modifiers
61 * @return {@code true} if {@code mod} includes the
100 public static boolean isStatic(int mod) {
101 return (mod & STATIC) != 0;
102 }
103
104 /**
105 * Return {@code true} if the integer argument includes the
106 * {@code final} modifier, {@code false} otherwise.
107 *
108 * @param mod a set of modifiers
109 * @return {@code true} if {@code mod} includes the
110 * {@code final} modifier; {@code false} otherwise.
111 */
112 public static boolean isFinal(int mod) {
113 return (mod & FINAL) != 0;
114 }
115
116 /**
117 * Return {@code true} if the integer argument includes the
118 * {@code synchronized} modifier, {@code false} otherwise.
119 *
120 * @apiNote {@code isSynchronized} should only be called with the modifiers
121 * of a {@linkplain Method#getModifiers() method}.
122 *
123 * @param mod a set of modifiers
124 * @return {@code true} if {@code mod} includes the
125 * {@code synchronized} modifier; {@code false} otherwise.
126 */
127 public static boolean isSynchronized(int mod) {
128 return (mod & SYNCHRONIZED) != 0;
129 }
130
131 /**
132 * Return {@code true} if the integer argument includes the
133 * {@code identity} modifier, {@code false} otherwise.
134 *
135 * @apiNote {@code isIdentity} should only be called with the modifiers
136 * of a {@linkplain Class#getModifiers() class}.
137 *
138 * @param mod a set of modifiers
139 * @return {@code true} if {@code mod} includes the
140 * {@code identity} modifier; {@code false} otherwise.
141 */
142 public static boolean isIdentity(int mod) {
143 return (mod & IDENTITY) != 0;
144 }
145
146 /**
147 * Return {@code true} if the integer argument includes the
148 * {@code volatile} modifier, {@code false} otherwise.
149 *
150 * @param mod a set of modifiers
151 * @return {@code true} if {@code mod} includes the
152 * {@code volatile} modifier; {@code false} otherwise.
153 */
154 public static boolean isVolatile(int mod) {
155 return (mod & VOLATILE) != 0;
156 }
157
158 /**
159 * Return {@code true} if the integer argument includes the
160 * {@code value} modifier, {@code false} otherwise.
161 *
162 * @apiNote {@code isValue} should only be called with the modifiers
163 * of a {@linkplain Class#getModifiers() class}.
164 *
165 * @param mod a set of modifiers
166 * @return {@code true} if {@code mod} includes the
167 * {@code value} modifier; {@code false} otherwise.
168 */
169 public static boolean isValue(int mod) {
170 return (mod & VALUE) != 0;
171 }
172
173 /**
174 * Return {@code true} if the integer argument includes the
175 * {@code transient} modifier, {@code false} otherwise.
176 *
177 * @param mod a set of modifiers
178 * @return {@code true} if {@code mod} includes the
179 * {@code transient} modifier; {@code false} otherwise.
180 */
181 public static boolean isTransient(int mod) {
182 return (mod & TRANSIENT) != 0;
183 }
184
185 /**
186 * Return {@code true} if the integer argument includes the
187 * {@code native} modifier, {@code false} otherwise.
188 *
189 * @param mod a set of modifiers
190 * @return {@code true} if {@code mod} includes the
191 * {@code native} modifier; {@code false} otherwise.
192 */
312 * The {@code int} value representing the {@code static}
313 * modifier.
314 * @see AccessFlag#STATIC
315 */
316 public static final int STATIC = 0x00000008;
317
318 /**
319 * The {@code int} value representing the {@code final}
320 * modifier.
321 * @see AccessFlag#FINAL
322 */
323 public static final int FINAL = 0x00000010;
324
325 /**
326 * The {@code int} value representing the {@code synchronized}
327 * modifier.
328 * @see AccessFlag#SYNCHRONIZED
329 */
330 public static final int SYNCHRONIZED = 0x00000020;
331
332 /**
333 * The {@code int} value representing the {@code ACC_IDENTITY}
334 * modifier.
335 */
336 public static final int IDENTITY = 0x00000020;
337
338 /**
339 * The {@code int} value representing the {@code value}
340 * modifier.
341 * @see AccessFlag#VALUE
342 */
343 public static final int VALUE = 0x00000040;
344
345 /**
346 * The {@code int} value representing the {@code volatile}
347 * modifier.
348 * @see AccessFlag#VOLATILE
349 */
350 public static final int VOLATILE = 0x00000040;
351
352 /**
353 * The {@code int} value representing the {@code transient}
354 * modifier.
355 * @see AccessFlag#TRANSIENT
356 */
357 public static final int TRANSIENT = 0x00000080;
358
359 /**
360 * The {@code int} value representing the {@code native}
361 * modifier.
362 * @see AccessFlag#NATIVE
363 */
364 public static final int NATIVE = 0x00000100;
402 return (mod & MANDATED) != 0;
403 }
404
405 // Note on the FOO_MODIFIERS fields and fooModifiers() methods:
406 // the sets of modifiers are not guaranteed to be constants
407 // across time and Java SE releases. Therefore, it would not be
408 // appropriate to expose an external interface to this information
409 // that would allow the values to be treated as Java-level
410 // constants since the values could be constant folded and updates
411 // to the sets of modifiers missed. Thus, the fooModifiers()
412 // methods return an unchanging values for a given release, but a
413 // value that can potentially change over time.
414
415 /**
416 * The Java source modifiers that can be applied to a class.
417 * @jls 8.1.1 Class Modifiers
418 */
419 private static final int CLASS_MODIFIERS =
420 Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE |
421 Modifier.ABSTRACT | Modifier.STATIC | Modifier.FINAL |
422 Modifier.IDENTITY | Modifier.VALUE |
423 Modifier.STRICT;
424
425 /**
426 * The Java source modifiers that can be applied to an interface.
427 * @jls 9.1.1 Interface Modifiers
428 */
429 private static final int INTERFACE_MODIFIERS =
430 Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE |
431 Modifier.ABSTRACT | Modifier.STATIC | Modifier.STRICT;
432
433
434 /**
435 * The Java source modifiers that can be applied to a constructor.
436 * @jls 8.8.3 Constructor Modifiers
437 */
438 private static final int CONSTRUCTOR_MODIFIERS =
439 Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE;
440
441 /**
442 * The Java source modifiers that can be applied to a method.
|