1 /* 2 * Copyright (c) 2022, 2025, 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 /** 29 * Class file format versions of the Java virtual machine. 30 * 31 * See the appropriate edition of <cite>The Java Virtual Machine 32 * Specification</cite> for information about a particular class file 33 * format version. 34 * 35 * <p>Note that additional class file format version constants will be 36 * added to model future releases of the Java Virtual Machine 37 * Specification. 38 * 39 * @apiNote 40 * The complete version used in a class file includes a major version 41 * and a minor version; this enum only models the major version. A 42 * Java virtual machine implementation is required to support a range 43 * of major versions; see the corresponding edition of the <cite>The 44 * Java Virtual Machine Specification</cite> for details. 45 * 46 * @since 20 47 * @see System#getProperties System property {@code java.class.version} 48 * @see java.compiler/javax.lang.model.SourceVersion 49 */ 50 @SuppressWarnings("doclint:reference") // cross-module links 51 public enum ClassFileFormatVersion { 52 /* 53 * Summary of class file format evolution; previews are listed for 54 * convenience, but they are not modeled by this enum. 55 * 1.1: InnerClasses, Synthetic, Deprecated attributes 56 * 1.2: ACC_STRICT modifier 57 * 1.3: no changes 58 * 1.4: no changes 59 * 1.5: Annotations (Runtime(Inv/V)isible(Parameter)Annotations attributes); 60 * Generics (Signature, LocalVariableTypeTable attributes); 61 * EnclosingMethod attribute 62 * 1.6: Verification by type checking (StackMapTable attribute) 63 * 1.7: Verification by type checking enforced (jsr and ret opcodes 64 * obsolete); java.lang.invoke support (JSR 292) (CONSTANT_MethodHandle, 65 * CONSTANT_MethodType, CONSTANT_InvokeDynamic constant pool entries, 66 * BoostrapMethods attribute); <clinit> method must be ACC_STATIC 67 * 1.8: private, static, and non-abstract (default) methods in interfaces; 68 * Type Annotations (JEP 104) (Runtime(Inv/V)isibleTypeAnnotations 69 * attribute); MethodParameters attribute 70 * 9: JSR 376 - modules (JSR 376, JEP 261) (Module, ModuleMainClass, 71 * ModulePackages attributes, CONSTANT_Module, CONSTANT_Package 72 * constant pool entries, ACC_MODULE modifier) 73 * 10: minor tweak to requires_flags in Module attribute 74 * 11: Nest mates (JEP 181) (NestHost, NestMembers attributes); 75 * CONSTANT_Dynamic (JEP 309) constant pool entry 76 * 12: Preview Features (JEP 12) (minor version must be 0 or 65535) 77 * 13: no changes 78 * 14: no changes; (JEP 359 Records in Preview) 79 * 15: no changes; (JEP 384 Records in 2nd Preview, JEP 360 Sealed Classes 80 * in Preview) 81 * 16: Records (JEP 395) (Record attribute); (JEP 397 Sealed Classes in 2nd 82 * Preview) 83 * 17: Sealed Classes (JEP 409) (PermittedSubclasses attribute); ACC_STRICT 84 * modifier obsolete (JEP 306) 85 * 18: no changes 86 * 19: no changes 87 * 20: no changes 88 * 21: no changes 89 * 22: no changes 90 * 23: no changes 91 * 24: no changes 92 */ 93 94 /** 95 * The original version. 96 * 97 * The format described in <cite>The Java Virtual Specification, 98 * First Edition</cite>. 99 */ 100 RELEASE_0(45), 101 102 /** 103 * The version recognized by the Java Platform 1.1. 104 * 105 * @apiNote 106 * While {@code RELEASE_0} and {@code RELEASE_1} have the same 107 * {@linkplain #major() major version}, several additional 108 * attributes were defined for {@code RELEASE_1} (JVMS {@jvms 109 * 4.7}). 110 * 111 */ 112 RELEASE_1(45), 113 114 /** 115 * The version introduced by the Java 2 Platform, Standard Edition, 116 * v 1.2. 117 * 118 * The format described in <cite>The Java Virtual Machine 119 * Specification, Second Edition</cite>, which includes the {@link 120 * AccessFlag#STRICT ACC_STRICT} access flag. 121 */ 122 RELEASE_2(46), 123 124 /** 125 * The version introduced by the Java 2 Platform, Standard Edition, 126 * v 1.3. 127 */ 128 RELEASE_3(47), 129 130 /** 131 * The version introduced by the Java 2 Platform, Standard Edition, 132 * v 1.4. 133 */ 134 RELEASE_4(48), 135 136 /** 137 * The version introduced by the Java 2 Platform, Standard 138 * Edition 5.0. 139 * 140 * @see <a 141 * href="https://jcp.org/aboutJava/communityprocess/maintenance/jsr924/index.html"> 142 * <cite>The Java Virtual Machine Specification, Second Edition updated for Java SE 5.0</cite></a> 143 * @see <a href="https://jcp.org/en/jsr/detail?id=14"> 144 * JSR 14: Add Generic Types To The Java™ Programming Language</a> 145 * @see <a href="https://jcp.org/en/jsr/detail?id=175"> 146 * JSR 175: A Metadata Facility for the Java™ Programming Language</a> 147 */ 148 RELEASE_5(49), 149 150 /** 151 * The version introduced by the Java Platform, Standard Edition 152 * 6. 153 * 154 * @see <a 155 * href="https://jcp.org/aboutJava/communityprocess/maintenance/jsr924/index2.html"> 156 * <cite>The Java Virtual Machine Specification, Java SE, Second Edition updated for Java SE 6</cite></a> 157 */ 158 RELEASE_6(50), 159 160 /** 161 * The version introduced by the Java Platform, Standard Edition 162 * 7. 163 * 164 * @see <a 165 * href="https://docs.oracle.com/javase/specs/jvms/se7/html/index.html"> 166 * <cite>The Java Virtual Machine Specification, Java SE 7 Edition</cite></a> 167 */ 168 RELEASE_7(51), 169 170 /** 171 * The version introduced by the Java Platform, Standard Edition 172 * 8. 173 * 174 * @see <a 175 * href="https://docs.oracle.com/javase/specs/jvms/se8/html/index.html"> 176 * <cite>The Java Virtual Machine Specification, Java SE 8 Edition</cite></a> 177 * @see <a href="https://jcp.org/en/jsr/detail?id=335"> 178 * JSR 335: Lambda Expressions for the Java™ Programming Language</a> 179 */ 180 RELEASE_8(52), 181 182 /** 183 * The version introduced by the Java Platform, Standard Edition 184 * 9. 185 * 186 * @see <a 187 * href="https://docs.oracle.com/javase/specs/jvms/se9/html/index.html"> 188 * <cite>The Java Virtual Machine Specification, Java SE 9 Edition</cite></a> 189 * @see <a href="https://jcp.org/en/jsr/detail?id=376"> 190 * JSR 376: Java™ Platform Module System</a> 191 */ 192 RELEASE_9(53), 193 194 /** 195 * The version introduced by the Java Platform, Standard Edition 196 * 10. 197 * 198 * @see <a 199 * href="https://docs.oracle.com/javase/specs/jvms/se10/html/index.html"> 200 * <cite>The Java Virtual Machine Specification, Java SE 10 Edition</cite></a> 201 */ 202 RELEASE_10(54), 203 204 /** 205 * The version introduced by the Java Platform, Standard Edition 206 * 11. 207 * 208 * @see <a 209 * href="https://docs.oracle.com/javase/specs/jvms/se11/html/index.html"> 210 * <cite>The Java Virtual Machine Specification, Java SE 11 Edition</cite></a> 211 * @see <a href="https://openjdk.org/jeps/181"> 212 * JEP 181: Nest-Based Access Control</a> 213 */ 214 RELEASE_11(55), 215 216 /** 217 * The version introduced by the Java Platform, Standard Edition 218 * 12. 219 * 220 * @see <a 221 * href="https://docs.oracle.com/javase/specs/jvms/se12/html/index.html"> 222 * <cite>The Java Virtual Machine Specification, Java SE 12 Edition</cite></a> 223 */ 224 RELEASE_12(56), 225 226 /** 227 * The version introduced by the Java Platform, Standard Edition 228 * 13. 229 * 230 * @see <a 231 * href="https://docs.oracle.com/javase/specs/jvms/se13/html/index.html"> 232 * <cite>The Java Virtual Machine Specification, Java SE 13 Edition</cite></a> 233 */ 234 RELEASE_13(57), 235 236 /** 237 * The version introduced by the Java Platform, Standard Edition 238 * 14. 239 * 240 * @see <a 241 * href="https://docs.oracle.com/javase/specs/jvms/se14/html/index.html"> 242 * <cite>The Java Virtual Machine Specification, Java SE 14 Edition</cite></a> 243 */ 244 RELEASE_14(58), 245 246 /** 247 * The version introduced by the Java Platform, Standard Edition 248 * 15. 249 * 250 * @see <a 251 * href="https://docs.oracle.com/javase/specs/jvms/se15/html/index.html"> 252 * <cite>The Java Virtual Machine Specification, Java SE 15 Edition</cite></a> 253 * @see <a href="https://openjdk.org/jeps/371"> 254 * JEP 371: Hidden Classes</a> 255 */ 256 RELEASE_15(59), 257 258 /** 259 * The version introduced by the Java Platform, Standard Edition 260 * 16. 261 * 262 * @see <a 263 * href="https://docs.oracle.com/javase/specs/jvms/se16/html/index.html"> 264 * <cite>The Java Virtual Machine Specification, Java SE 16 Edition</cite></a> 265 */ 266 RELEASE_16(60), 267 268 /** 269 * The version introduced by the Java Platform, Standard Edition 270 * 17. 271 * 272 * Additions in this release include sealed classes and 273 * restoration of always-strict floating-point semantics. 274 * 275 * @see <a 276 * href="https://docs.oracle.com/javase/specs/jvms/se17/html/index.html"> 277 * <cite>The Java Virtual Machine Specification, Java SE 17 Edition</cite></a> 278 * @see <a href="https://openjdk.org/jeps/306"> 279 * JEP 306: Restore Always-Strict Floating-Point Semantics</a> 280 * @see <a href="https://openjdk.org/jeps/409"> 281 * JEP 409: Sealed Classes</a> 282 */ 283 RELEASE_17(61), 284 285 /** 286 * The version introduced by the Java Platform, Standard Edition 287 * 18. 288 * 289 * @see <a 290 * href="https://docs.oracle.com/javase/specs/jvms/se18/html/index.html"> 291 * <cite>The Java Virtual Machine Specification, Java SE 18 Edition</cite></a> 292 */ 293 RELEASE_18(62), 294 295 /** 296 * The version introduced by the Java Platform, Standard Edition 297 * 19. 298 * 299 * @see <a 300 * href="https://docs.oracle.com/javase/specs/jvms/se19/html/index.html"> 301 * <cite>The Java Virtual Machine Specification, Java SE 19 Edition</cite></a> 302 */ 303 RELEASE_19(63), 304 305 /** 306 * The version introduced by the Java Platform, Standard Edition 307 * 20. 308 * 309 * @see <a 310 * href="https://docs.oracle.com/javase/specs/jvms/se20/html/index.html"> 311 * <cite>The Java Virtual Machine Specification, Java SE 20 Edition</cite></a> 312 */ 313 RELEASE_20(64), 314 315 /** 316 * The version introduced by the Java Platform, Standard Edition 317 * 21. 318 * 319 * @since 21 320 * 321 * @see <a 322 * href="https://docs.oracle.com/javase/specs/jvms/se21/html/index.html"> 323 * <cite>The Java Virtual Machine Specification, Java SE 21 Edition</cite></a> 324 */ 325 RELEASE_21(65), 326 327 /** 328 * The version introduced by the Java Platform, Standard Edition 329 * 22. 330 * 331 * @since 22 332 * 333 * @see <a 334 * href="https://docs.oracle.com/javase/specs/jvms/se22/html/index.html"> 335 * <cite>The Java Virtual Machine Specification, Java SE 22 Edition</cite></a> 336 */ 337 RELEASE_22(66), 338 339 /** 340 * The version introduced by the Java Platform, Standard Edition 341 * 23. 342 * 343 * @since 23 344 * 345 * @see <a 346 * href="https://docs.oracle.com/javase/specs/jvms/se23/html/index.html"> 347 * <cite>The Java Virtual Machine Specification, Java SE 23 Edition</cite></a> 348 */ 349 RELEASE_23(67), 350 351 /** 352 * The version introduced by the Java Platform, Standard Edition 353 * 24. 354 * 355 * @since 24 356 * 357 * @see <a 358 * href="https://docs.oracle.com/javase/specs/jvms/se24/html/index.html"> 359 * <cite>The Java Virtual Machine Specification, Java SE 24 Edition</cite></a> 360 */ 361 RELEASE_24(68), 362 363 /** 364 * The version introduced by the Java Platform, Standard Edition 365 * 25. 366 * 367 * @since 25 368 * 369 * @see <a 370 * href="https://docs.oracle.com/javase/specs/jvms/se25/html/index.html"> 371 * <cite>The Java Virtual Machine Specification, Java SE 25 Edition</cite></a> 372 */ 373 RELEASE_25(69), 374 375 /** 376 * The version introduced by the Java Platform, Standard Edition 377 * 26. 378 * 379 * @since 26 380 * 381 * @see <a 382 * href="https://docs.oracle.com/javase/specs/jvms/se26/html/index.html"> 383 * <cite>The Java Virtual Machine Specification, Java SE 26 Edition</cite></a> 384 */ 385 RELEASE_26(70), 386 ; // Reduce code churn when appending new constants 387 388 // Note to maintainers: when adding constants for newer releases, 389 // the implementation of latest() must be updated too. 390 391 private final int major; 392 393 private ClassFileFormatVersion(int major) { 394 this.major = major; 395 } 396 397 /** 398 * {@return the latest class file format version} 399 */ 400 public static ClassFileFormatVersion latest() { 401 return RELEASE_26; 402 } 403 404 /** 405 * {@return the major class file version as an integer} 406 * @jvms 4.1 The {@code ClassFile} Structure 407 */ 408 public int major() { 409 return major; 410 } 411 412 /** 413 * {@return the latest class file format version that is usable 414 * under the runtime version argument} If the runtime version's 415 * {@linkplain Runtime.Version#feature() feature} is greater than 416 * the feature of the {@linkplain #runtimeVersion() runtime 417 * version} of the {@linkplain #latest() latest class file format 418 * version}, an {@code IllegalArgumentException} is thrown. 419 * 420 * <p>Because the class file format versions of the Java platform 421 * have so far followed a linear progression, only the feature 422 * component of a runtime version is queried to determine the 423 * mapping to a class file format version. If that linearity 424 * changes in the future, other components of the runtime version 425 * may influence the result. 426 * 427 * @apiNote 428 * An expression to convert from a string value, for example 429 * {@code "17"}, to the corresponding class file format version, 430 * {@code RELEASE_17}, is: 431 * 432 * {@snippet lang="java" : 433 * ClassFileFormatVersion.valueOf(Runtime.Version.parse("17"))} 434 * 435 * @param rv runtime version to map to a class file format version 436 * @throws IllegalArgumentException if the feature of version 437 * argument is greater than the feature of the platform version. 438 */ 439 public static ClassFileFormatVersion valueOf(Runtime.Version rv) { 440 // Could also implement this as a switch where a case was 441 // added with each new release. 442 return valueOf("RELEASE_" + rv.feature()); 443 } 444 445 /** 446 * {@return the least runtime version that supports this class 447 * file format version; otherwise {@code null}} The returned 448 * runtime version has a {@linkplain Runtime.Version#feature() 449 * feature} large enough to support this class file format version 450 * and has no other elements set. 451 * 452 * Class file format versions greater than or equal to {@link 453 * RELEASE_6} have non-{@code null} results. 454 */ 455 public Runtime.Version runtimeVersion() { 456 // Starting with Java SE 6, the leading digit was the primary 457 // way of identifying the platform version. 458 if (this.compareTo(RELEASE_6) >= 0) { 459 return Runtime.Version.parse(Integer.toString(ordinal())); 460 } else { 461 return null; 462 } 463 } 464 465 /** 466 * {@return the latest class file format version whose major class 467 * file version matches the argument} 468 * @param major the major class file version as an integer 469 * @throws IllegalArgumentException if the argument is outside of 470 * the range of major class file versions 471 */ 472 public static ClassFileFormatVersion fromMajor(int major) { 473 if (major < 45 // RELEASE_0.major() 474 || major > latest().major()) { 475 throw new IllegalArgumentException("Out of range major class file version " 476 + major); 477 } 478 // RELEASE_0 and RELEASE_1 both have a major version of 45; 479 // return RELEASE_1 for an argument of 45. 480 return values()[major-44]; 481 } 482 }