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. 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 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 permitsValue} modifier, {@code false} otherwise. 128 * 129 * @param mod a set of modifiers 130 * @return {@code true} if {@code mod} includes the 131 * {@code permitsValue} modifier; {@code false} otherwise. 132 */ 133 public static boolean isPermitsValue(int mod) { 134 return (mod & PERMITS_VALUE) != 0; 135 } 136 137 /** 138 * Return {@code true} if the integer argument includes the 139 * {@code volatile} modifier, {@code false} otherwise. 140 * 141 * @param mod a set of modifiers 142 * @return {@code true} if {@code mod} includes the 143 * {@code volatile} modifier; {@code false} otherwise. 144 */ 145 public static boolean isVolatile(int mod) { 146 return (mod & VOLATILE) != 0; 147 } 148 149 /** 150 * Return {@code true} if the integer argument includes the 151 * {@code transient} modifier, {@code false} otherwise. 152 * 153 * @param mod a set of modifiers 154 * @return {@code true} if {@code mod} includes the 155 * {@code transient} modifier; {@code false} otherwise. 156 */ 157 public static boolean isTransient(int mod) { 158 return (mod & TRANSIENT) != 0; 159 } 160 161 /** 162 * Return {@code true} if the integer argument includes the 163 * {@code native} modifier, {@code false} otherwise. 164 * 165 * @param mod a set of modifiers 166 * @return {@code true} if {@code mod} includes the 167 * {@code native} modifier; {@code false} otherwise. 168 */ 169 public static boolean isNative(int mod) { 170 return (mod & NATIVE) != 0; 171 } 172 173 /** 174 * Return {@code true} if the integer argument includes the 175 * {@code interface} modifier, {@code false} otherwise. 176 * 177 * @param mod a set of modifiers 178 * @return {@code true} if {@code mod} includes the 179 * {@code interface} modifier; {@code false} otherwise. 180 */ 181 public static boolean isInterface(int mod) { 182 return (mod & INTERFACE) != 0; 183 } 184 185 /** 186 * Return {@code true} if the integer argument includes the 187 * {@code abstract} modifier, {@code false} otherwise. 188 * 189 * @param mod a set of modifiers 190 * @return {@code true} if {@code mod} includes the 191 * {@code abstract} modifier; {@code false} otherwise. 192 */ 193 public static boolean isAbstract(int mod) { 194 return (mod & ABSTRACT) != 0; 195 } 196 197 /** 198 * Return {@code true} if the integer argument includes the 199 * {@code strictfp} modifier, {@code false} otherwise. 200 * 201 * @param mod a set of modifiers 202 * @return {@code true} if {@code mod} includes the 203 * {@code strictfp} modifier; {@code false} otherwise. 204 */ 205 public static boolean isStrict(int mod) { 206 return (mod & STRICT) != 0; 207 } 208 209 /** 210 * Return a string describing the access modifier flags in 211 * the specified modifier. For example: 212 * <blockquote><pre> 213 * public final synchronized strictfp 214 * </pre></blockquote> 215 * The modifier names are returned in an order consistent with the 216 * suggested modifier orderings given in sections 8.1.1, 8.3.1, 8.4.3, 8.8.3, and 9.1.1 of 217 * <cite>The Java Language Specification</cite>. 218 * The full modifier ordering used by this method is: 219 * <blockquote> {@code 220 * public protected private abstract static final transient 221 * volatile synchronized native strictfp 222 * interface } </blockquote> 223 * The {@code interface} modifier discussed in this class is 224 * not a true modifier in the Java language and it appears after 225 * all other modifiers listed by this method. This method may 226 * return a string of modifiers that are not valid modifiers of a 227 * Java entity; in other words, no checking is done on the 228 * possible validity of the combination of modifiers represented 229 * by the input. 230 * 231 * Note that to perform such checking for a known kind of entity, 232 * such as a constructor or method, first AND the argument of 233 * {@code toString} with the appropriate mask from a method like 234 * {@link #constructorModifiers} or {@link #methodModifiers}. 235 * 236 * @param mod a set of modifiers 237 * @return a string representation of the set of modifiers 238 * represented by {@code mod} 239 */ 240 public static String toString(int mod) { 241 StringJoiner sj = new StringJoiner(" "); 242 243 if ((mod & PUBLIC) != 0) sj.add("public"); 244 if ((mod & PROTECTED) != 0) sj.add("protected"); 245 if ((mod & PRIVATE) != 0) sj.add("private"); 246 247 /* Canonical order */ 248 if ((mod & ABSTRACT) != 0) sj.add("abstract"); 249 if ((mod & STATIC) != 0) sj.add("static"); 250 if ((mod & FINAL) != 0) sj.add("final"); 251 if ((mod & TRANSIENT) != 0) sj.add("transient"); 252 if ((mod & VOLATILE) != 0) sj.add("volatile"); 253 if ((mod & SYNCHRONIZED) != 0) sj.add("synchronized"); 254 if ((mod & NATIVE) != 0) sj.add("native"); 255 if ((mod & STRICT) != 0) sj.add("strictfp"); 256 if ((mod & INTERFACE) != 0) sj.add("interface"); 257 258 return sj.toString(); 259 } 260 261 /* 262 * Access modifier flag constants from tables 4.1, 4.4, 4.5, and 4.7 of 263 * <cite>The Java Virtual Machine Specification</cite> 264 */ 265 266 /** 267 * The {@code int} value representing the {@code public} 268 * modifier. 269 * @see AccessFlag#PUBLIC 270 */ 271 public static final int PUBLIC = 0x00000001; 272 273 /** 274 * The {@code int} value representing the {@code private} 275 * modifier. 276 * @see AccessFlag#PRIVATE 277 */ 278 public static final int PRIVATE = 0x00000002; 279 280 /** 281 * The {@code int} value representing the {@code protected} 282 * modifier. 283 * @see AccessFlag#PROTECTED 284 */ 285 public static final int PROTECTED = 0x00000004; 286 287 /** 288 * The {@code int} value representing the {@code static} 289 * modifier. 290 * @see AccessFlag#STATIC 291 */ 292 public static final int STATIC = 0x00000008; 293 294 /** 295 * The {@code int} value representing the {@code final} 296 * modifier. 297 * @see AccessFlag#FINAL 298 */ 299 public static final int FINAL = 0x00000010; 300 301 /** 302 * The {@code int} value representing the {@code synchronized} 303 * modifier. 304 * @see AccessFlag#SYNCHRONIZED 305 */ 306 public static final int SYNCHRONIZED = 0x00000020; 307 308 /** 309 * The {@code int} value representing the {@code permits_value} 310 * modifier. 311 */ 312 public static final int PERMITS_VALUE = 0x00000040; 313 314 /** 315 * The {@code int} value representing the {@code volatile} 316 * modifier. 317 * @see AccessFlag#VOLATILE 318 */ 319 public static final int VOLATILE = 0x00000040; 320 321 /** 322 * The {@code int} value representing the {@code transient} 323 * modifier. 324 * @see AccessFlag#TRANSIENT 325 */ 326 public static final int TRANSIENT = 0x00000080; 327 328 /** 329 * The {@code int} value representing the {@code native} 330 * modifier. 331 * @see AccessFlag#NATIVE 332 */ 333 public static final int NATIVE = 0x00000100; 334 335 /** 336 * The {@code int} value representing the {@code interface} 337 * modifier. 338 * @see AccessFlag#INTERFACE 339 */ 340 public static final int INTERFACE = 0x00000200; 341 342 /** 343 * The {@code int} value representing the {@code abstract} 344 * modifier. 345 * @see AccessFlag#ABSTRACT 346 */ 347 public static final int ABSTRACT = 0x00000400; 348 349 /** 350 * The {@code int} value representing the {@code strictfp} 351 * modifier. 352 */ 353 public static final int STRICT = 0x00000800; 354 355 // Bits not (yet) exposed in the public API either because they 356 // have different meanings for fields and methods and there is no 357 // way to distinguish between the two in this class, or because 358 // they are not Java programming language keywords 359 static final int BRIDGE = 0x00000040; 360 static final int VARARGS = 0x00000080; 361 static final int SYNTHETIC = 0x00001000; 362 static final int ANNOTATION = 0x00002000; 363 static final int ENUM = 0x00004000; 364 static final int MANDATED = 0x00008000; 365 static boolean isSynthetic(int mod) { 366 return (mod & SYNTHETIC) != 0; 367 } 368 369 static boolean isMandated(int mod) { 370 return (mod & MANDATED) != 0; 371 } 372 373 // Note on the FOO_MODIFIERS fields and fooModifiers() methods: 374 // the sets of modifiers are not guaranteed to be constants 375 // across time and Java SE releases. Therefore, it would not be 376 // appropriate to expose an external interface to this information 377 // that would allow the values to be treated as Java-level 378 // constants since the values could be constant folded and updates 379 // to the sets of modifiers missed. Thus, the fooModifiers() 380 // methods return an unchanging values for a given release, but a 381 // value that can potentially change over time. 382 383 /** 384 * The Java source modifiers that can be applied to a class. 385 * @jls 8.1.1 Class Modifiers 386 */ 387 private static final int CLASS_MODIFIERS = 388 Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE | 389 Modifier.ABSTRACT | Modifier.STATIC | Modifier.FINAL | 390 Modifier.STRICT | Modifier.PERMITS_VALUE; 391 392 /** 393 * The Java source modifiers that can be applied to an interface. 394 * @jls 9.1.1 Interface Modifiers 395 */ 396 private static final int INTERFACE_MODIFIERS = 397 Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE | 398 Modifier.ABSTRACT | Modifier.STATIC | Modifier.STRICT; 399 400 401 /** 402 * The Java source modifiers that can be applied to a constructor. 403 * @jls 8.8.3 Constructor Modifiers 404 */ 405 private static final int CONSTRUCTOR_MODIFIERS = 406 Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE; 407 408 /** 409 * The Java source modifiers that can be applied to a method. 410 * @jls 8.4.3 Method Modifiers 411 */ 412 private static final int METHOD_MODIFIERS = 413 Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE | 414 Modifier.ABSTRACT | Modifier.STATIC | Modifier.FINAL | 415 Modifier.SYNCHRONIZED | Modifier.NATIVE | Modifier.STRICT; 416 417 /** 418 * The Java source modifiers that can be applied to a field. 419 * @jls 8.3.1 Field Modifiers 420 */ 421 private static final int FIELD_MODIFIERS = 422 Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE | 423 Modifier.STATIC | Modifier.FINAL | Modifier.TRANSIENT | 424 Modifier.VOLATILE; 425 426 /** 427 * The Java source modifiers that can be applied to a method or constructor parameter. 428 * @jls 8.4.1 Formal Parameters 429 */ 430 private static final int PARAMETER_MODIFIERS = 431 Modifier.FINAL; 432 433 static final int ACCESS_MODIFIERS = 434 Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE; 435 436 /** 437 * Return an {@code int} value OR-ing together the source language 438 * modifiers that can be applied to a class. 439 * @return an {@code int} value OR-ing together the source language 440 * modifiers that can be applied to a class. 441 * 442 * @jls 8.1.1 Class Modifiers 443 * @since 1.7 444 */ 445 public static int classModifiers() { 446 return CLASS_MODIFIERS; 447 } 448 449 /** 450 * Return an {@code int} value OR-ing together the source language 451 * modifiers that can be applied to an interface. 452 * @return an {@code int} value OR-ing together the source language 453 * modifiers that can be applied to an interface. 454 * 455 * @jls 9.1.1 Interface Modifiers 456 * @since 1.7 457 */ 458 public static int interfaceModifiers() { 459 return INTERFACE_MODIFIERS; 460 } 461 462 /** 463 * Return an {@code int} value OR-ing together the source language 464 * modifiers that can be applied to a constructor. 465 * @return an {@code int} value OR-ing together the source language 466 * modifiers that can be applied to a constructor. 467 * 468 * @jls 8.8.3 Constructor Modifiers 469 * @since 1.7 470 */ 471 public static int constructorModifiers() { 472 return CONSTRUCTOR_MODIFIERS; 473 } 474 475 /** 476 * Return an {@code int} value OR-ing together the source language 477 * modifiers that can be applied to a method. 478 * @return an {@code int} value OR-ing together the source language 479 * modifiers that can be applied to a method. 480 * 481 * @jls 8.4.3 Method Modifiers 482 * @since 1.7 483 */ 484 public static int methodModifiers() { 485 return METHOD_MODIFIERS; 486 } 487 488 /** 489 * Return an {@code int} value OR-ing together the source language 490 * modifiers that can be applied to a field. 491 * @return an {@code int} value OR-ing together the source language 492 * modifiers that can be applied to a field. 493 * 494 * @jls 8.3.1 Field Modifiers 495 * @since 1.7 496 */ 497 public static int fieldModifiers() { 498 return FIELD_MODIFIERS; 499 } 500 501 /** 502 * Return an {@code int} value OR-ing together the source language 503 * modifiers that can be applied to a parameter. 504 * @return an {@code int} value OR-ing together the source language 505 * modifiers that can be applied to a parameter. 506 * 507 * @jls 8.4.1 Formal Parameters 508 * @since 1.8 509 */ 510 public static int parameterModifiers() { 511 return PARAMETER_MODIFIERS; 512 } 513 } --- EOF ---