1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.  Oracle designates this
9 * particular file as subject to the "Classpath" exception as provided
10 * by Oracle in the LICENSE file that accompanied this code.
11 *
12 * This code is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 * version 2 for more details (a copy is included in the LICENSE file that
16 * accompanied this code).
17 *
18 * You should have received a copy of the GNU General Public License version
19 * 2 along with this work; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21 *
22 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
23 * or visit www.oracle.com if you need additional information or have any
24 * questions.
25 */
26
27package java.lang.reflect;
28
29/**
30 * The Modifier class provides {@code static} methods and
31 * constants to decode class and member access modifiers.  The sets of
32 * modifiers are represented as integers with distinct bit positions
33 * representing different modifiers.  The values for the constants
34 * representing the modifiers are taken from the tables in sections 4.1, 4.4, 4.5, and 4.7 of
35 * <cite>The Java&trade; Virtual Machine Specification</cite>.
36 *
37 * @see Class#getModifiers()
38 * @see Member#getModifiers()
39 *
40 * @author Nakul Saraiya
41 * @author Kenneth Russell
42 */
43public class Modifier {
44
45    /**
46     * Return {@code true} if the integer argument includes the
47     * {@code public} modifier, {@code false} otherwise.
48     *
49     * @param   mod a set of modifiers
50     * @return {@code true} if {@code mod} includes the
51     * {@code public} modifier; {@code false} otherwise.
52     */
53    public static boolean isPublic(int mod) {
54        return (mod & PUBLIC) != 0;
55    }
56
57    /**
58     * Return {@code true} if the integer argument includes the
59     * {@code private} modifier, {@code false} otherwise.
60     *
61     * @param   mod a set of modifiers
62     * @return {@code true} if {@code mod} includes the
63     * {@code private} modifier; {@code false} otherwise.
64     */
65    public static boolean isPrivate(int mod) {
66        return (mod & PRIVATE) != 0;
67    }
68
69    /**
70     * Return {@code true} if the integer argument includes the
71     * {@code protected} modifier, {@code false} otherwise.
72     *
73     * @param   mod a set of modifiers
74     * @return {@code true} if {@code mod} includes the
75     * {@code protected} modifier; {@code false} otherwise.
76     */
77    public static boolean isProtected(int mod) {
78        return (mod & PROTECTED) != 0;
79    }
80
81    /**
82     * Return {@code true} if the integer argument includes the
83     * {@code static} modifier, {@code false} otherwise.
84     *
85     * @param   mod a set of modifiers
86     * @return {@code true} if {@code mod} includes the
87     * {@code static} modifier; {@code false} otherwise.
88     */
89    public static boolean isStatic(int mod) {
90        return (mod & STATIC) != 0;
91    }
92
93    /**
94     * Return {@code true} if the integer argument includes the
95     * {@code final} modifier, {@code false} otherwise.
96     *
97     * @param   mod a set of modifiers
98     * @return {@code true} if {@code mod} includes the
99     * {@code final} modifier; {@code false} otherwise.
100     */
101    public static boolean isFinal(int mod) {
102        return (mod & FINAL) != 0;
103    }
104
105    /**
106     * Return {@code true} if the integer argument includes the
107     * {@code synchronized} modifier, {@code false} otherwise.
108     *
109     * @param   mod a set of modifiers
110     * @return {@code true} if {@code mod} includes the
111     * {@code synchronized} modifier; {@code false} otherwise.
112     */
113    public static boolean isSynchronized(int mod) {
114        return (mod & SYNCHRONIZED) != 0;
115    }
116
117    /**
118     * Return {@code true} if the integer argument includes the
119     * {@code volatile} modifier, {@code false} otherwise.
120     *
121     * @param   mod a set of modifiers
122     * @return {@code true} if {@code mod} includes the
123     * {@code volatile} modifier; {@code false} otherwise.
124     */
125    public static boolean isVolatile(int mod) {
126        return (mod & VOLATILE) != 0;
127    }
128
129    /**
130     * Returns true if the given modifiers contain {@link Modifier#CONSTRUCTOR}.
131     * @hide
132     */
133    public static boolean isConstructor(int modifiers) {
134        return ((modifiers & Modifier.CONSTRUCTOR) != 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     */
157    public static boolean isNative(int mod) {
158        return (mod & NATIVE) != 0;
159    }
160
161    /**
162     * Return {@code true} if the integer argument includes the
163     * {@code interface} modifier, {@code false} otherwise.
164     *
165     * @param   mod a set of modifiers
166     * @return {@code true} if {@code mod} includes the
167     * {@code interface} modifier; {@code false} otherwise.
168     */
169    public static boolean isInterface(int mod) {
170        return (mod & INTERFACE) != 0;
171    }
172
173    /**
174     * Return {@code true} if the integer argument includes the
175     * {@code abstract} modifier, {@code false} otherwise.
176     *
177     * @param   mod a set of modifiers
178     * @return {@code true} if {@code mod} includes the
179     * {@code abstract} modifier; {@code false} otherwise.
180     */
181    public static boolean isAbstract(int mod) {
182        return (mod & ABSTRACT) != 0;
183    }
184
185    /**
186     * Return {@code true} if the integer argument includes the
187     * {@code strictfp} modifier, {@code false} otherwise.
188     *
189     * @param   mod a set of modifiers
190     * @return {@code true} if {@code mod} includes the
191     * {@code strictfp} modifier; {@code false} otherwise.
192     */
193    public static boolean isStrict(int mod) {
194        return (mod & STRICT) != 0;
195    }
196
197    /**
198     * Return a string describing the access modifier flags in
199     * the specified modifier. For example:
200     * <blockquote><pre>
201     *    public final synchronized strictfp
202     * </pre></blockquote>
203     * The modifier names are returned in an order consistent with the
204     * suggested modifier orderings given in sections 8.1.1, 8.3.1, 8.4.3, 8.8.3, and 9.1.1 of
205     * <cite>The Java&trade; Language Specification</cite>.
206     * The full modifier ordering used by this method is:
207     * <blockquote> {@code
208     * public protected private abstract static final transient
209     * volatile synchronized native strictfp
210     * interface } </blockquote>
211     * The {@code interface} modifier discussed in this class is
212     * not a true modifier in the Java language and it appears after
213     * all other modifiers listed by this method.  This method may
214     * return a string of modifiers that are not valid modifiers of a
215     * Java entity; in other words, no checking is done on the
216     * possible validity of the combination of modifiers represented
217     * by the input.
218     *
219     * Note that to perform such checking for a known kind of entity,
220     * such as a constructor or method, first AND the argument of
221     * {@code toString} with the appropriate mask from a method like
222     * {@link #constructorModifiers} or {@link #methodModifiers}.
223     *
224     * @param   mod a set of modifiers
225     * @return  a string representation of the set of modifiers
226     * represented by {@code mod}
227     */
228    public static String toString(int mod) {
229        StringBuilder sb = new StringBuilder();
230        int len;
231
232        if ((mod & PUBLIC) != 0)        sb.append("public ");
233        if ((mod & PROTECTED) != 0)     sb.append("protected ");
234        if ((mod & PRIVATE) != 0)       sb.append("private ");
235
236        /* Canonical order */
237        if ((mod & ABSTRACT) != 0)      sb.append("abstract ");
238        if ((mod & STATIC) != 0)        sb.append("static ");
239        if ((mod & FINAL) != 0)         sb.append("final ");
240        if ((mod & TRANSIENT) != 0)     sb.append("transient ");
241        if ((mod & VOLATILE) != 0)      sb.append("volatile ");
242        if ((mod & SYNCHRONIZED) != 0)  sb.append("synchronized ");
243        if ((mod & NATIVE) != 0)        sb.append("native ");
244        if ((mod & STRICT) != 0)        sb.append("strictfp ");
245        if ((mod & INTERFACE) != 0)     sb.append("interface ");
246
247        if ((len = sb.length()) > 0)    /* trim trailing space */
248            return sb.toString().substring(0, len-1);
249        return "";
250    }
251
252    /*
253     * Access modifier flag constants from tables 4.1, 4.4, 4.5, and 4.7 of
254     * <cite>The Java&trade; Virtual Machine Specification</cite>
255     */
256
257    /**
258     * The {@code int} value representing the {@code public}
259     * modifier.
260     */
261    public static final int PUBLIC           = 0x00000001;
262
263    /**
264     * The {@code int} value representing the {@code private}
265     * modifier.
266     */
267    public static final int PRIVATE          = 0x00000002;
268
269    /**
270     * The {@code int} value representing the {@code protected}
271     * modifier.
272     */
273    public static final int PROTECTED        = 0x00000004;
274
275    /**
276     * The {@code int} value representing the {@code static}
277     * modifier.
278     */
279    public static final int STATIC           = 0x00000008;
280
281    /**
282     * The {@code int} value representing the {@code final}
283     * modifier.
284     */
285    public static final int FINAL            = 0x00000010;
286
287    /**
288     * The {@code int} value representing the {@code synchronized}
289     * modifier.
290     */
291    public static final int SYNCHRONIZED     = 0x00000020;
292
293    /**
294     * The {@code int} value representing the {@code volatile}
295     * modifier.
296     */
297    public static final int VOLATILE         = 0x00000040;
298
299    /**
300     * The {@code int} value representing the {@code transient}
301     * modifier.
302     */
303    public static final int TRANSIENT        = 0x00000080;
304
305    /**
306     * The {@code int} value representing the {@code native}
307     * modifier.
308     */
309    public static final int NATIVE           = 0x00000100;
310
311    /**
312     * The {@code int} value representing the {@code interface}
313     * modifier.
314     */
315    public static final int INTERFACE        = 0x00000200;
316
317    /**
318     * The {@code int} value representing the {@code abstract}
319     * modifier.
320     */
321    public static final int ABSTRACT         = 0x00000400;
322
323    /**
324     * The {@code int} value representing the {@code strictfp}
325     * modifier.
326     */
327    public static final int STRICT           = 0x00000800;
328
329    // Bits not (yet) exposed in the public API either because they
330    // have different meanings for fields and methods and there is no
331    // way to distinguish between the two in this class, or because
332    // they are not Java programming language keywords
333    static final int BRIDGE    = 0x00000040;
334    static final int VARARGS   = 0x00000080;
335    /**
336     * @hide
337     */
338    public static final int SYNTHETIC = 0x00001000;
339    static final int ANNOTATION  = 0x00002000;
340    static final int ENUM      = 0x00004000;
341    static final int MANDATED  = 0x00008000;
342    static boolean isSynthetic(int mod) {
343      return (mod & SYNTHETIC) != 0;
344    }
345
346    static boolean isMandated(int mod) {
347      return (mod & MANDATED) != 0;
348    }
349
350    // Note on the FOO_MODIFIERS fields and fooModifiers() methods:
351    // the sets of modifiers are not guaranteed to be constants
352    // across time and Java SE releases. Therefore, it would not be
353    // appropriate to expose an external interface to this information
354    // that would allow the values to be treated as Java-level
355    // constants since the values could be constant folded and updates
356    // to the sets of modifiers missed. Thus, the fooModifiers()
357    // methods return an unchanging values for a given release, but a
358    // value that can potentially change over time.
359
360    /**
361     * Dex addition to mark instance constructors and static class
362     * initializer methods.
363     * @hide
364     */
365    public static final int CONSTRUCTOR = 0x10000;
366
367    /**
368     * Default methods are marked with a synthetic access flag
369     * to speed up class loading and invocation target lookup.
370     * Implies INTERFACE, not-ABSTRACT, and not-STATIC.
371     *
372     * @hide
373     */
374    public static final int DEFAULT = 0x00400000;
375
376    /**
377     * The Java source modifiers that can be applied to a class.
378     * @jls 8.1.1 Class Modifiers
379     */
380    private static final int CLASS_MODIFIERS =
381        Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE |
382        Modifier.ABSTRACT       | Modifier.STATIC       | Modifier.FINAL   |
383        Modifier.STRICT;
384
385    /**
386     * The Java source modifiers that can be applied to an interface.
387     * @jls 9.1.1 Interface Modifiers
388     */
389    private static final int INTERFACE_MODIFIERS =
390        Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE |
391        Modifier.ABSTRACT       | Modifier.STATIC       | Modifier.STRICT;
392
393
394    /**
395     * The Java source modifiers that can be applied to a constructor.
396     * @jls 8.8.3 Constructor Modifiers
397     */
398    private static final int CONSTRUCTOR_MODIFIERS =
399        Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE;
400
401    /**
402     * The Java source modifiers that can be applied to a method.
403     * @jls8.4.3  Method Modifiers
404     */
405    private static final int METHOD_MODIFIERS =
406        Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE |
407        Modifier.ABSTRACT       | Modifier.STATIC       | Modifier.FINAL   |
408        Modifier.SYNCHRONIZED   | Modifier.NATIVE       | Modifier.STRICT;
409
410    /**
411     * The Java source modifiers that can be applied to a field.
412     * @jls 8.3.1  Field Modifiers
413     */
414    private static final int FIELD_MODIFIERS =
415        Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE |
416        Modifier.STATIC         | Modifier.FINAL        | Modifier.TRANSIENT |
417        Modifier.VOLATILE;
418
419    /**
420     * The Java source modifiers that can be applied to a method or constructor parameter.
421     * @jls 8.4.1 Formal Parameters
422     */
423    private static final int PARAMETER_MODIFIERS =
424        Modifier.FINAL;
425
426    /**
427     *
428     */
429    static final int ACCESS_MODIFIERS =
430        Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE;
431
432    /**
433     * Return an {@code int} value OR-ing together the source language
434     * modifiers that can be applied to a class.
435     * @return an {@code int} value OR-ing together the source language
436     * modifiers that can be applied to a class.
437     *
438     * @jls 8.1.1 Class Modifiers
439     * @since 1.7
440     */
441    public static int classModifiers() {
442        return CLASS_MODIFIERS;
443    }
444
445    /**
446     * Return an {@code int} value OR-ing together the source language
447     * modifiers that can be applied to an interface.
448     * @return an {@code int} value OR-ing together the source language
449     * modifiers that can be applied to an interface.
450     *
451     * @jls 9.1.1 Interface Modifiers
452     * @since 1.7
453     */
454    public static int interfaceModifiers() {
455        return INTERFACE_MODIFIERS;
456    }
457
458    /**
459     * Return an {@code int} value OR-ing together the source language
460     * modifiers that can be applied to a constructor.
461     * @return an {@code int} value OR-ing together the source language
462     * modifiers that can be applied to a constructor.
463     *
464     * @jls 8.8.3 Constructor Modifiers
465     * @since 1.7
466     */
467    public static int constructorModifiers() {
468        return CONSTRUCTOR_MODIFIERS;
469    }
470
471    /**
472     * Return an {@code int} value OR-ing together the source language
473     * modifiers that can be applied to a method.
474     * @return an {@code int} value OR-ing together the source language
475     * modifiers that can be applied to a method.
476     *
477     * @jls 8.4.3 Method Modifiers
478     * @since 1.7
479     */
480    public static int methodModifiers() {
481        return METHOD_MODIFIERS;
482    }
483
484    /**
485     * Return an {@code int} value OR-ing together the source language
486     * modifiers that can be applied to a field.
487     * @return an {@code int} value OR-ing together the source language
488     * modifiers that can be applied to a field.
489     *
490     * @jls 8.3.1 Field Modifiers
491     * @since 1.7
492     */
493    public static int fieldModifiers() {
494        return FIELD_MODIFIERS;
495    }
496
497    /**
498     * Return an {@code int} value OR-ing together the source language
499     * modifiers that can be applied to a parameter.
500     * @return an {@code int} value OR-ing together the source language
501     * modifiers that can be applied to a parameter.
502     *
503     * @jls 8.4.1 Formal Parameters
504     * @since 1.8
505     */
506    public static int parameterModifiers() {
507        return PARAMETER_MODIFIERS;
508    }
509}
510