Home | History | Annotate | Download | only in reflect
      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 
     27 package 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  */
     43 public 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