1 /*
   2  * Copyright (c) 1996, 2019, 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 4.1, 4.4, 4.5, and 4.7 of
  36  * <cite>The Java&trade; Virtual Machine Specification</cite>.
  37  *
  38  * @see Class#getModifiers()
  39  * @see Member#getModifiers()
  40  *
  41  * @author Nakul Saraiya
  42  * @author Kenneth Russell
  43  * @since 1.1
  44  */
  45 public class Modifier {
  46     /**
  47      * Do not call.
  48      */
  49     @Deprecated(forRemoval=true, since="14")
  50     public Modifier() {}
  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
  59      * {@code public} modifier; {@code false} otherwise.
  60      */
  61     public static boolean isPublic(int mod) {
  62         return (mod & PUBLIC) != 0;
  63     }
  64 
  65     /**
  66      * Return {@code true} if the integer argument includes the
  67      * {@code private} modifier, {@code false} otherwise.
  68      *
  69      * @param   mod a set of modifiers
  70      * @return {@code true} if {@code mod} includes the
  71      * {@code private} modifier; {@code false} otherwise.
  72      */
  73     public static boolean isPrivate(int mod) {
  74         return (mod & PRIVATE) != 0;
  75     }
  76 
  77     /**
  78      * Return {@code true} if the integer argument includes the
  79      * {@code protected} modifier, {@code false} otherwise.
  80      *
  81      * @param   mod a set of modifiers
  82      * @return {@code true} if {@code mod} includes the
  83      * {@code protected} modifier; {@code false} otherwise.
  84      */
  85     public static boolean isProtected(int mod) {
  86         return (mod & PROTECTED) != 0;
  87     }
  88 
  89     /**
  90      * Return {@code true} if the integer argument includes the
  91      * {@code static} modifier, {@code false} otherwise.
  92      *
  93      * @param   mod a set of modifiers
  94      * @return {@code true} if {@code mod} includes the
  95      * {@code static} modifier; {@code false} otherwise.
  96      */
  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      */
 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         StringJoiner sj = new StringJoiner(" ");
 230 
 231         if ((mod & PUBLIC) != 0)        sj.add("public");
 232         if ((mod & PROTECTED) != 0)     sj.add("protected");
 233         if ((mod & PRIVATE) != 0)       sj.add("private");
 234 
 235         /* Canonical order */
 236         if ((mod & ABSTRACT) != 0)      sj.add("abstract");
 237         if ((mod & STATIC) != 0)        sj.add("static");
 238         if ((mod & FINAL) != 0)         sj.add("final");
 239         if ((mod & TRANSIENT) != 0)     sj.add("transient");
 240         if ((mod & VOLATILE) != 0)      sj.add("volatile");
 241         if ((mod & SYNCHRONIZED) != 0)  sj.add("synchronized");
 242         if ((mod & NATIVE) != 0)        sj.add("native");
 243         if ((mod & STRICT) != 0)        sj.add("strictfp");
 244         if ((mod & INTERFACE) != 0)     sj.add("interface");
 245 
 246         return sj.toString();
 247     }
 248 
 249     /*
 250      * Access modifier flag constants from tables 4.1, 4.4, 4.5, and 4.7 of
 251      * <cite>The Java&trade; Virtual Machine Specification</cite>
 252      */
 253 
 254     /**
 255      * The {@code int} value representing the {@code public}
 256      * modifier.
 257      */
 258     public static final int PUBLIC           = 0x00000001;
 259 
 260     /**
 261      * The {@code int} value representing the {@code private}
 262      * modifier.
 263      */
 264     public static final int PRIVATE          = 0x00000002;
 265 
 266     /**
 267      * The {@code int} value representing the {@code protected}
 268      * modifier.
 269      */
 270     public static final int PROTECTED        = 0x00000004;
 271 
 272     /**
 273      * The {@code int} value representing the {@code static}
 274      * modifier.
 275      */
 276     public static final int STATIC           = 0x00000008;
 277 
 278     /**
 279      * The {@code int} value representing the {@code final}
 280      * modifier.
 281      */
 282     public static final int FINAL            = 0x00000010;
 283 
 284     /**
 285      * The {@code int} value representing the {@code synchronized}
 286      * modifier.
 287      */
 288     public static final int SYNCHRONIZED     = 0x00000020;
 289 
 290     /**
 291      * The {@code int} value representing the {@code volatile}
 292      * modifier.
 293      */
 294     public static final int VOLATILE         = 0x00000040;
 295 
 296     /**
 297      * The {@code int} value representing the {@code transient}
 298      * modifier.
 299      */
 300     public static final int TRANSIENT        = 0x00000080;
 301 
 302     /**
 303      * The {@code int} value representing the {@code native}
 304      * modifier.
 305      */
 306     public static final int NATIVE           = 0x00000100;
 307 
 308     /**
 309      * The {@code int} value representing the {@code interface}
 310      * modifier.
 311      */
 312     public static final int INTERFACE        = 0x00000200;
 313 
 314     /**
 315      * The {@code int} value representing the {@code abstract}
 316      * modifier.
 317      */
 318     public static final int ABSTRACT         = 0x00000400;
 319 
 320     /**
 321      * The {@code int} value representing the {@code strictfp}
 322      * modifier.
 323      */
 324     public static final int STRICT           = 0x00000800;
 325 
 326     // Bits not (yet) exposed in the public API either because they
 327     // have different meanings for fields and methods and there is no
 328     // way to distinguish between the two in this class, or because
 329     // they are not Java programming language keywords
 330     static final int BRIDGE    = 0x00000040;
 331     static final int VARARGS   = 0x00000080;
 332     static final int SYNTHETIC = 0x00001000;
 333     static final int ANNOTATION  = 0x00002000;
 334     static final int ENUM      = 0x00004000;
 335     static final int MANDATED  = 0x00008000;
 336     static boolean isSynthetic(int mod) {
 337       return (mod & SYNTHETIC) != 0;
 338     }
 339 
 340     static boolean isMandated(int mod) {
 341       return (mod & MANDATED) != 0;
 342     }
 343 
 344     // Note on the FOO_MODIFIERS fields and fooModifiers() methods:
 345     // the sets of modifiers are not guaranteed to be constants
 346     // across time and Java SE releases. Therefore, it would not be
 347     // appropriate to expose an external interface to this information
 348     // that would allow the values to be treated as Java-level
 349     // constants since the values could be constant folded and updates
 350     // to the sets of modifiers missed. Thus, the fooModifiers()
 351     // methods return an unchanging values for a given release, but a
 352     // value that can potentially change over time.
 353 
 354     /**
 355      * The Java source modifiers that can be applied to a class.
 356      * @jls 8.1.1 Class Modifiers
 357      */
 358     private static final int CLASS_MODIFIERS =
 359         Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE |
 360         Modifier.ABSTRACT       | Modifier.STATIC       | Modifier.FINAL   |
 361         Modifier.STRICT;
 362 
 363     /**
 364      * The Java source modifiers that can be applied to an interface.
 365      * @jls 9.1.1 Interface Modifiers
 366      */
 367     private static final int INTERFACE_MODIFIERS =
 368         Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE |
 369         Modifier.ABSTRACT       | Modifier.STATIC       | Modifier.STRICT;
 370 
 371 
 372     /**
 373      * The Java source modifiers that can be applied to a constructor.
 374      * @jls 8.8.3 Constructor Modifiers
 375      */
 376     private static final int CONSTRUCTOR_MODIFIERS =
 377         Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE;
 378 
 379     /**
 380      * The Java source modifiers that can be applied to a method.
 381      * @jls8.4.3  Method Modifiers
 382      */
 383     private static final int METHOD_MODIFIERS =
 384         Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE |
 385         Modifier.ABSTRACT       | Modifier.STATIC       | Modifier.FINAL   |
 386         Modifier.SYNCHRONIZED   | Modifier.NATIVE       | Modifier.STRICT;
 387 
 388     /**
 389      * The Java source modifiers that can be applied to a field.
 390      * @jls 8.3.1 Field Modifiers
 391      */
 392     private static final int FIELD_MODIFIERS =
 393         Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE |
 394         Modifier.STATIC         | Modifier.FINAL        | Modifier.TRANSIENT |
 395         Modifier.VOLATILE;
 396 
 397     /**
 398      * The Java source modifiers that can be applied to a method or constructor parameter.
 399      * @jls 8.4.1 Formal Parameters
 400      */
 401     private static final int PARAMETER_MODIFIERS =
 402         Modifier.FINAL;
 403 
 404     /**
 405      *
 406      */
 407     static final int ACCESS_MODIFIERS =
 408         Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE;
 409 
 410     /**
 411      * Return an {@code int} value OR-ing together the source language
 412      * modifiers that can be applied to a class.
 413      * @return an {@code int} value OR-ing together the source language
 414      * modifiers that can be applied to a class.
 415      *
 416      * @jls 8.1.1 Class Modifiers
 417      * @since 1.7
 418      */
 419     public static int classModifiers() {
 420         return CLASS_MODIFIERS;
 421     }
 422 
 423     /**
 424      * Return an {@code int} value OR-ing together the source language
 425      * modifiers that can be applied to an interface.
 426      * @return an {@code int} value OR-ing together the source language
 427      * modifiers that can be applied to an interface.
 428      *
 429      * @jls 9.1.1 Interface Modifiers
 430      * @since 1.7
 431      */
 432     public static int interfaceModifiers() {
 433         return INTERFACE_MODIFIERS;
 434     }
 435 
 436     /**
 437      * Return an {@code int} value OR-ing together the source language
 438      * modifiers that can be applied to a constructor.
 439      * @return an {@code int} value OR-ing together the source language
 440      * modifiers that can be applied to a constructor.
 441      *
 442      * @jls 8.8.3 Constructor Modifiers
 443      * @since 1.7
 444      */
 445     public static int constructorModifiers() {
 446         return CONSTRUCTOR_MODIFIERS;
 447     }
 448 
 449     /**
 450      * Return an {@code int} value OR-ing together the source language
 451      * modifiers that can be applied to a method.
 452      * @return an {@code int} value OR-ing together the source language
 453      * modifiers that can be applied to a method.
 454      *
 455      * @jls 8.4.3 Method Modifiers
 456      * @since 1.7
 457      */
 458     public static int methodModifiers() {
 459         return METHOD_MODIFIERS;
 460     }
 461 
 462     /**
 463      * Return an {@code int} value OR-ing together the source language
 464      * modifiers that can be applied to a field.
 465      * @return an {@code int} value OR-ing together the source language
 466      * modifiers that can be applied to a field.
 467      *
 468      * @jls 8.3.1 Field Modifiers
 469      * @since 1.7
 470      */
 471     public static int fieldModifiers() {
 472         return FIELD_MODIFIERS;
 473     }
 474 
 475     /**
 476      * Return an {@code int} value OR-ing together the source language
 477      * modifiers that can be applied to a parameter.
 478      * @return an {@code int} value OR-ing together the source language
 479      * modifiers that can be applied to a parameter.
 480      *
 481      * @jls 8.4.1 Formal Parameters
 482      * @since 1.8
 483      */
 484     public static int parameterModifiers() {
 485         return PARAMETER_MODIFIERS;
 486     }
 487 }