diff --git a/byte-buddy-dep/src/main/java/net/bytebuddy/ClassFileVersion.java b/byte-buddy-dep/src/main/java/net/bytebuddy/ClassFileVersion.java index de6feb0f47a..172faf5a035 100644 --- a/byte-buddy-dep/src/main/java/net/bytebuddy/ClassFileVersion.java +++ b/byte-buddy-dep/src/main/java/net/bytebuddy/ClassFileVersion.java @@ -126,7 +126,7 @@ public class ClassFileVersion implements Comparable { /** * The class file version of Java 18. */ - public static final ClassFileVersion JAVA_V18 = new ClassFileVersion(Opcodes.V17 + 1); + public static final ClassFileVersion JAVA_V18 = new ClassFileVersion(Opcodes.V18); /** * A version locator for the executing JVM. @@ -286,6 +286,15 @@ public static ClassFileVersion ofJavaVersion(int javaVersion) { } } + /** + * Returns the latest officially supported Java version when experimental support is not enabled. + * + * @return The latest officially supported Java version. + */ + public static ClassFileVersion latest() { + return ClassFileVersion.JAVA_V18; + } + /** * Finds the highest class file version that is compatible to the current JVM version. Prior to Java 9, this is achieved * by parsing the {@code java.version} property which is provided by {@link java.lang.System#getProperty(String)}. If the system diff --git a/byte-buddy-dep/src/main/java/net/bytebuddy/utility/OpenedClassReader.java b/byte-buddy-dep/src/main/java/net/bytebuddy/utility/OpenedClassReader.java index ec252a585b3..d5ac0112524 100644 --- a/byte-buddy-dep/src/main/java/net/bytebuddy/utility/OpenedClassReader.java +++ b/byte-buddy-dep/src/main/java/net/bytebuddy/utility/OpenedClassReader.java @@ -84,10 +84,10 @@ private static T doPrivileged(PrivilegedAction action) { */ public static ClassReader of(byte[] binaryRepresentation) { if (EXPERIMENTAL) { - ClassFileVersion classFileVersion = ClassFileVersion.ofClassFile(binaryRepresentation); - if (classFileVersion.isGreaterThan(ClassFileVersion.JAVA_V14)) { - binaryRepresentation[6] = (byte) (ClassFileVersion.JAVA_V14.getMajorVersion() >>> 8); - binaryRepresentation[7] = (byte) ClassFileVersion.JAVA_V14.getMajorVersion(); + ClassFileVersion classFileVersion = ClassFileVersion.ofClassFile(binaryRepresentation), latest = ClassFileVersion.latest(); + if (classFileVersion.isGreaterThan(latest)) { + binaryRepresentation[6] = (byte) (latest.getMajorVersion() >>> 8); + binaryRepresentation[7] = (byte) latest.getMajorVersion(); ClassReader classReader = new ClassReader(binaryRepresentation); binaryRepresentation[6] = (byte) (classFileVersion.getMajorVersion() >>> 8); binaryRepresentation[7] = (byte) classFileVersion.getMajorVersion(); diff --git a/byte-buddy-dep/src/test/java/net/bytebuddy/ClassFileVersionTest.java b/byte-buddy-dep/src/test/java/net/bytebuddy/ClassFileVersionTest.java index 2c720284ce2..ac6f2b5476d 100644 --- a/byte-buddy-dep/src/test/java/net/bytebuddy/ClassFileVersionTest.java +++ b/byte-buddy-dep/src/test/java/net/bytebuddy/ClassFileVersionTest.java @@ -52,6 +52,21 @@ public void testClassFile() throws Exception { assertThat(ClassFileVersion.of(Object.class).getMinorMajorVersion(), not(0)); } + @Test + public void testLatestVersion() throws Exception { + Pattern pattern = Pattern.compile("JAVA_V[0-9]+"); + ClassFileVersion latest = null; + for (Field field : ClassFileVersion.class.getFields()) { + if (pattern.matcher(field.getName()).matches()) { + ClassFileVersion classFileVersion = (ClassFileVersion) field.get(null); + if (latest == null || classFileVersion.isGreaterThan(latest)) { + latest = classFileVersion; + } + } + } + assertThat(ClassFileVersion.latest(), is(latest)); + } + @Test(expected = IllegalArgumentException.class) public void testIllegalClassFile() throws Exception { ClassFileVersion.ofClassFile(new byte[0]); diff --git a/pom.xml b/pom.xml index b87208332f1..48711d82d23 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ net.bytebuddy https://asm.ow2.io https://oss.sonatype.org - 9.1 + 9.2 5.8.0 4.13.2 2.23.0