/* * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package java.lang.reflect; /** * Class file format versions of the Java virtual machine. * * See the appropriate edition of The Java Virtual Machine * Specification for information about a particular class file * format version. * *

Note that additional class file format version constants will be * added to model future releases of the Java Virtual Machine * Specification. * * @apiNote * The complete version used in a class file includes a major version * and a minor version; this enum only models the major version. A * Java virtual machine implementation is required to support a range * of major versions; see the corresponding edition of the The * Java Virtual Machine Specification for details. * * @since 20 * @see System#getProperties System property {@code java.class.version} * @see java.compiler/javax.lang.model.SourceVersion */ @SuppressWarnings("doclint:reference") // cross-module links public enum ClassFileFormatVersion { /* * Summary of class file format evolution; previews are listed for * convenience, but they are not modeled by this enum. * 1.1: InnerClasses, Synthetic, Deprecated attributes * 1.2: ACC_STRICT modifier * 1.3: no changes * 1.4: no changes * 1.5: Annotations (Runtime(Inv/V)isible(Parameter)Annotations attributes); * Generics (Signature, LocalVariableTypeTable attributes); * EnclosingMethod attribute * 1.6: Verification by type checking (StackMapTable attribute) * 1.7: Verification by type checking enforced (jsr and ret opcodes * obsolete); java.lang.invoke support (JSR 292) (CONSTANT_MethodHandle, * CONSTANT_MethodType, CONSTANT_InvokeDynamic constant pool entries, * BoostrapMethods attribute); method must be ACC_STATIC * 1.8: private, static, and non-abstract (default) methods in interfaces; * Type Annotations (JEP 104) (Runtime(Inv/V)isibleTypeAnnotations * attribute); MethodParameters attribute * 9: JSR 376 - modules (JSR 376, JEP 261) (Module, ModuleMainClass, * ModulePackages attributes, CONSTANT_Module, CONSTANT_Package * constant pool entries, ACC_MODULE modifier) * 10: minor tweak to requires_flags in Module attribute * 11: Nest mates (JEP 181) (NestHost, NestMembers attributes); * CONSTANT_Dynamic (JEP 309) constant pool entry * 12: Preview Features (JEP 12) (minor version must be 0 or 65535) * 13: no changes * 14: no changes; (JEP 359 Records in Preview) * 15: no changes; (JEP 384 Records in 2nd Preview, JEP 360 Sealed Classes * in Preview) * 16: Records (JEP 395) (Record attribute); (JEP 397 Sealed Classes in 2nd * Preview) * 17: Sealed Classes (JEP 409) (PermittedSubclasses attribute); ACC_STRICT * modifier obsolete (JEP 306) * 18: no changes * 19: no changes * 20: no changes * 21: no changes * 22: no changes * 23: no changes * 24: no changes */ /** * The original version. * * The format described in The Java Virtual Specification, * First Edition. */ RELEASE_0(45), /** * The version recognized by the Java Platform 1.1. * * @apiNote * While {@code RELEASE_0} and {@code RELEASE_1} have the same * {@linkplain #major() major version}, several additional * attributes were defined for {@code RELEASE_1} (JVMS {@jvms * 4.7}). * */ RELEASE_1(45), /** * The version introduced by the Java 2 Platform, Standard Edition, * v 1.2. * * The format described in The Java Virtual Machine * Specification, Second Edition, which includes the {@link * AccessFlag#STRICT ACC_STRICT} access flag. */ RELEASE_2(46), /** * The version introduced by the Java 2 Platform, Standard Edition, * v 1.3. */ RELEASE_3(47), /** * The version introduced by the Java 2 Platform, Standard Edition, * v 1.4. */ RELEASE_4(48), /** * The version introduced by the Java 2 Platform, Standard * Edition 5.0. * * @see * The Java Virtual Machine Specification, Second Edition updated for Java SE 5.0 * @see * JSR 14: Add Generic Types To The Java™ Programming Language * @see * JSR 175: A Metadata Facility for the Java™ Programming Language */ RELEASE_5(49), /** * The version introduced by the Java Platform, Standard Edition * 6. * * @see * The Java Virtual Machine Specification, Java SE, Second Edition updated for Java SE 6 */ RELEASE_6(50), /** * The version introduced by the Java Platform, Standard Edition * 7. * * @see * The Java Virtual Machine Specification, Java SE 7 Edition */ RELEASE_7(51), /** * The version introduced by the Java Platform, Standard Edition * 8. * * @see * The Java Virtual Machine Specification, Java SE 8 Edition * @see * JSR 335: Lambda Expressions for the Java™ Programming Language */ RELEASE_8(52), /** * The version introduced by the Java Platform, Standard Edition * 9. * * @see * The Java Virtual Machine Specification, Java SE 9 Edition * @see * JSR 376: Java™ Platform Module System */ RELEASE_9(53), /** * The version introduced by the Java Platform, Standard Edition * 10. * * @see * The Java Virtual Machine Specification, Java SE 10 Edition */ RELEASE_10(54), /** * The version introduced by the Java Platform, Standard Edition * 11. * * @see * The Java Virtual Machine Specification, Java SE 11 Edition * @see * JEP 181: Nest-Based Access Control */ RELEASE_11(55), /** * The version introduced by the Java Platform, Standard Edition * 12. * * @see * The Java Virtual Machine Specification, Java SE 12 Edition */ RELEASE_12(56), /** * The version introduced by the Java Platform, Standard Edition * 13. * * @see * The Java Virtual Machine Specification, Java SE 13 Edition */ RELEASE_13(57), /** * The version introduced by the Java Platform, Standard Edition * 14. * * @see * The Java Virtual Machine Specification, Java SE 14 Edition */ RELEASE_14(58), /** * The version introduced by the Java Platform, Standard Edition * 15. * * @see * The Java Virtual Machine Specification, Java SE 15 Edition * @see * JEP 371: Hidden Classes */ RELEASE_15(59), /** * The version introduced by the Java Platform, Standard Edition * 16. * * @see * The Java Virtual Machine Specification, Java SE 16 Edition */ RELEASE_16(60), /** * The version introduced by the Java Platform, Standard Edition * 17. * * Additions in this release include sealed classes and * restoration of always-strict floating-point semantics. * * @see * The Java Virtual Machine Specification, Java SE 17 Edition * @see * JEP 306: Restore Always-Strict Floating-Point Semantics * @see * JEP 409: Sealed Classes */ RELEASE_17(61), /** * The version introduced by the Java Platform, Standard Edition * 18. * * @see * The Java Virtual Machine Specification, Java SE 18 Edition */ RELEASE_18(62), /** * The version introduced by the Java Platform, Standard Edition * 19. * * @see * The Java Virtual Machine Specification, Java SE 19 Edition */ RELEASE_19(63), /** * The version introduced by the Java Platform, Standard Edition * 20. * * @see * The Java Virtual Machine Specification, Java SE 20 Edition */ RELEASE_20(64), /** * The version introduced by the Java Platform, Standard Edition * 21. * * @since 21 * * @see * The Java Virtual Machine Specification, Java SE 21 Edition */ RELEASE_21(65), /** * The version introduced by the Java Platform, Standard Edition * 22. * * @since 22 * * @see * The Java Virtual Machine Specification, Java SE 22 Edition */ RELEASE_22(66), /** * The version introduced by the Java Platform, Standard Edition * 23. * * @since 23 * * @see * The Java Virtual Machine Specification, Java SE 23 Edition */ RELEASE_23(67), /** * The version introduced by the Java Platform, Standard Edition * 24. * * @since 24 * * @see * The Java Virtual Machine Specification, Java SE 24 Edition */ RELEASE_24(68), /** * The version introduced by the Java Platform, Standard Edition * 25. * * @since 25 * * @see * The Java Virtual Machine Specification, Java SE 25 Edition */ RELEASE_25(69), ; // Reduce code churn when appending new constants // Note to maintainers: when adding constants for newer releases, // the implementation of latest() must be updated too. private final int major; private ClassFileFormatVersion(int major) { this.major = major; } /** * {@return the latest class file format version} */ public static ClassFileFormatVersion latest() { return RELEASE_25; } /** * {@return the major class file version as an integer} * @jvms 4.1 The {@code ClassFile} Structure */ public int major() { return major; } /** * {@return the latest class file format version that is usable * under the runtime version argument} If the runtime version's * {@linkplain Runtime.Version#feature() feature} is greater than * the feature of the {@linkplain #runtimeVersion() runtime * version} of the {@linkplain #latest() latest class file format * version}, an {@code IllegalArgumentException} is thrown. * *

Because the class file format versions of the Java platform * have so far followed a linear progression, only the feature * component of a runtime version is queried to determine the * mapping to a class file format version. If that linearity * changes in the future, other components of the runtime version * may influence the result. * * @apiNote * An expression to convert from a string value, for example * {@code "17"}, to the corresponding class file format version, * {@code RELEASE_17}, is: * * {@snippet lang="java" : * ClassFileFormatVersion.valueOf(Runtime.Version.parse("17"))} * * @param rv runtime version to map to a class file format version * @throws IllegalArgumentException if the feature of version * argument is greater than the feature of the platform version. */ public static ClassFileFormatVersion valueOf(Runtime.Version rv) { // Could also implement this as a switch where a case was // added with each new release. return valueOf("RELEASE_" + rv.feature()); } /** * {@return the least runtime version that supports this class * file format version; otherwise {@code null}} The returned * runtime version has a {@linkplain Runtime.Version#feature() * feature} large enough to support this class file format version * and has no other elements set. * * Class file format versions greater than or equal to {@link * RELEASE_6} have non-{@code null} results. */ public Runtime.Version runtimeVersion() { // Starting with Java SE 6, the leading digit was the primary // way of identifying the platform version. if (this.compareTo(RELEASE_6) >= 0) { return Runtime.Version.parse(Integer.toString(ordinal())); } else { return null; } } /** * {@return the latest class file format version whose major class * file version matches the argument} * @param major the major class file version as an integer * @throws IllegalArgumentException if the argument is outside of * the range of major class file versions */ public static ClassFileFormatVersion fromMajor(int major) { if (major < 45 // RELEASE_0.major() || major > latest().major()) { throw new IllegalArgumentException("Out of range major class file version " + major); } // RELEASE_0 and RELEASE_1 both have a major version of 45; // return RELEASE_1 for an argument of 45. return values()[major-44]; } }