mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-26 14:24:46 +02:00
470 lines
16 KiB
Java
470 lines
16 KiB
Java
/*
|
|
* 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 <cite>The Java Virtual Machine
|
|
* Specification</cite> for information about a particular class file
|
|
* format version.
|
|
*
|
|
* <p>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 <cite>The
|
|
* Java Virtual Machine Specification</cite> 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); <clinit> 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 <cite>The Java Virtual Specification,
|
|
* First Edition</cite>.
|
|
*/
|
|
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 <cite>The Java Virtual Machine
|
|
* Specification, Second Edition</cite>, 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 <a
|
|
* href="https://jcp.org/aboutJava/communityprocess/maintenance/jsr924/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Second Edition updated for Java SE 5.0</cite></a>
|
|
* @see <a href="https://jcp.org/en/jsr/detail?id=14">
|
|
* JSR 14: Add Generic Types To The Java™ Programming Language</a>
|
|
* @see <a href="https://jcp.org/en/jsr/detail?id=175">
|
|
* JSR 175: A Metadata Facility for the Java™ Programming Language</a>
|
|
*/
|
|
RELEASE_5(49),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 6.
|
|
*
|
|
* @see <a
|
|
* href="https://jcp.org/aboutJava/communityprocess/maintenance/jsr924/index2.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE, Second Edition updated for Java SE 6</cite></a>
|
|
*/
|
|
RELEASE_6(50),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 7.
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se7/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 7 Edition</cite></a>
|
|
*/
|
|
RELEASE_7(51),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 8.
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se8/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 8 Edition</cite></a>
|
|
* @see <a href="https://jcp.org/en/jsr/detail?id=335">
|
|
* JSR 335: Lambda Expressions for the Java™ Programming Language</a>
|
|
*/
|
|
RELEASE_8(52),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 9.
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se9/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 9 Edition</cite></a>
|
|
* @see <a href="https://jcp.org/en/jsr/detail?id=376">
|
|
* JSR 376: Java™ Platform Module System</a>
|
|
*/
|
|
RELEASE_9(53),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 10.
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se10/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 10 Edition</cite></a>
|
|
*/
|
|
RELEASE_10(54),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 11.
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se11/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 11 Edition</cite></a>
|
|
* @see <a href="https://openjdk.org/jeps/181">
|
|
* JEP 181: Nest-Based Access Control</a>
|
|
*/
|
|
RELEASE_11(55),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 12.
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se12/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 12 Edition</cite></a>
|
|
*/
|
|
RELEASE_12(56),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 13.
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se13/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 13 Edition</cite></a>
|
|
*/
|
|
RELEASE_13(57),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 14.
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se14/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 14 Edition</cite></a>
|
|
*/
|
|
RELEASE_14(58),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 15.
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se15/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 15 Edition</cite></a>
|
|
* @see <a href="https://openjdk.org/jeps/371">
|
|
* JEP 371: Hidden Classes</a>
|
|
*/
|
|
RELEASE_15(59),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 16.
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se16/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 16 Edition</cite></a>
|
|
*/
|
|
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 <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se17/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 17 Edition</cite></a>
|
|
* @see <a href="https://openjdk.org/jeps/306">
|
|
* JEP 306: Restore Always-Strict Floating-Point Semantics</a>
|
|
* @see <a href="https://openjdk.org/jeps/409">
|
|
* JEP 409: Sealed Classes</a>
|
|
*/
|
|
RELEASE_17(61),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 18.
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se18/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 18 Edition</cite></a>
|
|
*/
|
|
RELEASE_18(62),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 19.
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se19/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 19 Edition</cite></a>
|
|
*/
|
|
RELEASE_19(63),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 20.
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se20/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 20 Edition</cite></a>
|
|
*/
|
|
RELEASE_20(64),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 21.
|
|
*
|
|
* @since 21
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se21/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 21 Edition</cite></a>
|
|
*/
|
|
RELEASE_21(65),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 22.
|
|
*
|
|
* @since 22
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se22/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 22 Edition</cite></a>
|
|
*/
|
|
RELEASE_22(66),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 23.
|
|
*
|
|
* @since 23
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se23/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 23 Edition</cite></a>
|
|
*/
|
|
RELEASE_23(67),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 24.
|
|
*
|
|
* @since 24
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se24/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 24 Edition</cite></a>
|
|
*/
|
|
RELEASE_24(68),
|
|
|
|
/**
|
|
* The version introduced by the Java Platform, Standard Edition
|
|
* 25.
|
|
*
|
|
* @since 25
|
|
*
|
|
* @see <a
|
|
* href="https://docs.oracle.com/javase/specs/jvms/se25/html/index.html">
|
|
* <cite>The Java Virtual Machine Specification, Java SE 25 Edition</cite></a>
|
|
*/
|
|
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.
|
|
*
|
|
* <p>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];
|
|
}
|
|
}
|