Fix annotation arrays support in ClassFile metadata

As of gh-33616, Spring now supports metadata reading with the ClassFile
API on JDK 24+ runtimes. This commit fixes a bug where
`ArrayStoreException` were thrown when reading annotation attribute
values for arrays.

Fixes gh-35252
This commit is contained in:
Brian Clozel
2025-08-26 18:40:35 +02:00
parent d8804c798b
commit 2b7f88ee44
2 changed files with 55 additions and 14 deletions
@@ -290,11 +290,11 @@ public abstract class AbstractAnnotationMetadataTests {
void getComplexAttributeTypesReturnsAll() {
MultiValueMap<String, Object> attributes =
get(WithComplexAttributeTypes.class).getAllAnnotationAttributes(ComplexAttributes.class.getName());
assertThat(attributes).containsOnlyKeys("names", "count", "type", "subAnnotation");
assertThat(attributes).containsOnlyKeys("names", "count", "types", "subAnnotation");
assertThat(attributes.get("names")).hasSize(1);
assertThat(attributes.get("names").get(0)).isEqualTo(new String[]{"first", "second"});
assertThat(attributes.get("count")).containsExactlyInAnyOrder(TestEnum.ONE);
assertThat(attributes.get("type")).containsExactlyInAnyOrder(TestEnum.class);
assertThat(attributes.get("count").get(0)).isEqualTo(new TestEnum[]{TestEnum.ONE, TestEnum.TWO});
assertThat(attributes.get("types").get(0)).isEqualTo(new Class[]{TestEnum.class});
assertThat(attributes.get("subAnnotation")).hasSize(1);
}
@@ -312,8 +312,8 @@ public abstract class AbstractAnnotationMetadataTests {
void getAnnotationAttributeIntType() {
MultiValueMap<String, Object> attributes =
get(WithIntType.class).getAllAnnotationAttributes(ComplexAttributes.class.getName());
assertThat(attributes).containsOnlyKeys("names", "count", "type", "subAnnotation");
assertThat(attributes.get("type")).contains(int.class);
assertThat(attributes).containsOnlyKeys("names", "count", "types", "subAnnotation");
assertThat(attributes.get("types").get(0)).isEqualTo(new Class[]{int.class});
}
@Test
@@ -454,13 +454,13 @@ public abstract class AbstractAnnotationMetadataTests {
}
@ComplexAttributes(names = {"first", "second"}, count = TestEnum.ONE,
type = TestEnum.class, subAnnotation = @SubAnnotation(name="spring"))
@ComplexAttributes(names = {"first", "second"}, count = {TestEnum.ONE, TestEnum.TWO},
types = {TestEnum.class}, subAnnotation = @SubAnnotation(name="spring"))
@Metadata(mv = {42})
public static class WithComplexAttributeTypes {
}
@ComplexAttributes(names = "void", count = TestEnum.ONE, type = int.class,
@ComplexAttributes(names = "void", count = TestEnum.ONE, types = int.class,
subAnnotation = @SubAnnotation(name="spring"))
public static class WithIntType {
@@ -471,9 +471,9 @@ public abstract class AbstractAnnotationMetadataTests {
String[] names();
TestEnum count();
TestEnum[] count();
Class<?> type();
Class<?>[] types();
SubAnnotation subAnnotation();
}
@@ -484,7 +484,15 @@ public abstract class AbstractAnnotationMetadataTests {
}
public enum TestEnum {
ONE, TWO, THREE
ONE {
},
TWO {
},
THREE {
}
}
@RepeatableAnnotation(name = "first")