@@ -107,22 +107,56 @@ public class SubstrateAnnotationExtracter implements AnnotationExtracter {
107107 private static final Method hotSpotJDKReflectionGetMirror ;
108108 private static final Method hotSpotJDKReflectionGetMethod ;
109109 private static final Method hotSpotJDKReflectionGetField ;
110+ private static final boolean isHotSpotJDKReflectionAvailable ;
111+ private static final Method hotSpotResolvedObjectTypeImplMirror ;
112+ private static final Method hotSpotResolvedPrimitiveTypeMirror ;
113+ private static final Method hotSpotResolvedJavaMethodImplToJava ;
114+ private static final Method hotSpotResolvedJavaFieldImplToJava ;
110115
111116 static {
117+ recordComponentClass = ReflectionUtil .lookupClass (true , "java.lang.reflect.RecordComponent" );
118+ recordComponentAnnotations = recordComponentClass != null ? ReflectionUtil .lookupField (recordComponentClass , "annotations" ) : null ;
119+ recordComponentTypeAnnotations = recordComponentClass != null ? ReflectionUtil .lookupField (recordComponentClass , "typeAnnotations" ) : null ;
120+ recordComponentGetDeclaringRecord = recordComponentClass != null ? ReflectionUtil .lookupMethod (recordComponentClass , "getDeclaringRecord" ) : null ;
121+
122+ Object temporaryHotSpotJVMCIRuntimeReflection = null ;
123+ Method temporaryHotSpotJDKReflectionGetMirror = null ;
124+ Method temporaryHotSpotJDKReflectionGetMethod = null ;
125+ Method temporaryHotSpotJDKReflectionGetField = null ;
126+ boolean temporaryIsHotSpotJDKReflectionAvailable = true ;
127+
112128 try {
113- recordComponentClass = ReflectionUtil .lookupClass (true , "java.lang.reflect.RecordComponent" );
114- recordComponentAnnotations = recordComponentClass != null ? ReflectionUtil .lookupField (recordComponentClass , "annotations" ) : null ;
115- recordComponentTypeAnnotations = recordComponentClass != null ? ReflectionUtil .lookupField (recordComponentClass , "typeAnnotations" ) : null ;
116- recordComponentGetDeclaringRecord = recordComponentClass != null ? ReflectionUtil .lookupMethod (recordComponentClass , "getDeclaringRecord" ) : null ;
117129 Object hotSpotJVMCIRuntime = ReflectionUtil .lookupMethod (HotSpotJVMCIRuntime .class , "runtime" ).invoke (null );
118- hotSpotJVMCIRuntimeReflection = ReflectionUtil .lookupMethod (HotSpotJVMCIRuntime .class , "getReflection" ).invoke (hotSpotJVMCIRuntime );
119- hotSpotJDKReflectionGetMirror = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotJDKReflection" ), "getMirror" , HotSpotResolvedJavaType .class );
120- hotSpotJDKReflectionGetMethod = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotJDKReflection" ), "getMethod" ,
130+ temporaryHotSpotJVMCIRuntimeReflection = ReflectionUtil .lookupMethod (HotSpotJVMCIRuntime .class , "getReflection" ).invoke (hotSpotJVMCIRuntime );
131+ temporaryHotSpotJDKReflectionGetMirror = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotJDKReflection" ), "getMirror" , HotSpotResolvedJavaType .class );
132+ temporaryHotSpotJDKReflectionGetMethod = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotJDKReflection" ), "getMethod" ,
121133 Class .forName ("jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl" ));
122- hotSpotJDKReflectionGetField = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotJDKReflection" ), "getField" ,
134+ temporaryHotSpotJDKReflectionGetField = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotJDKReflection" ), "getField" ,
123135 Class .forName ("jdk.vm.ci.hotspot.HotSpotResolvedJavaFieldImpl" ));
124- } catch (ClassNotFoundException | IllegalAccessException | InvocationTargetException e ) {
125- throw GraalError .shouldNotReachHere (e );
136+ } catch (ClassNotFoundException | IllegalAccessException | InvocationTargetException | ReflectionUtil .ReflectionUtilError ex ) {
137+ temporaryIsHotSpotJDKReflectionAvailable = false ;
138+ }
139+
140+ isHotSpotJDKReflectionAvailable = temporaryIsHotSpotJDKReflectionAvailable ;
141+ hotSpotJVMCIRuntimeReflection = temporaryHotSpotJVMCIRuntimeReflection ;
142+ hotSpotJDKReflectionGetMirror = temporaryHotSpotJDKReflectionGetMirror ;
143+ hotSpotJDKReflectionGetMethod = temporaryHotSpotJDKReflectionGetMethod ;
144+ hotSpotJDKReflectionGetField = temporaryHotSpotJDKReflectionGetField ;
145+
146+ if (isHotSpotJDKReflectionAvailable ) {
147+ hotSpotResolvedObjectTypeImplMirror = null ;
148+ hotSpotResolvedPrimitiveTypeMirror = null ;
149+ hotSpotResolvedJavaMethodImplToJava = null ;
150+ hotSpotResolvedJavaFieldImplToJava = null ;
151+ } else {
152+ try {
153+ hotSpotResolvedObjectTypeImplMirror = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotResolvedObjectTypeImpl" ), "mirror" );
154+ hotSpotResolvedPrimitiveTypeMirror = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotResolvedPrimitiveType" ), "mirror" );
155+ hotSpotResolvedJavaMethodImplToJava = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl" ), "toJava" );
156+ hotSpotResolvedJavaFieldImplToJava = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotResolvedJavaFieldImpl" ), "toJava" );
157+ } catch (ClassNotFoundException e ) {
158+ throw GraalError .shouldNotReachHere (e );
159+ }
126160 }
127161 }
128162
@@ -380,14 +414,29 @@ private static AnnotatedElement getRoot(AnnotatedElement element) {
380414 if (element instanceof Package ) {
381415 return (Class <?>) packageGetPackageInfo .invoke (element );
382416 } else if (element instanceof HotSpotResolvedObjectType || element instanceof HotSpotResolvedJavaType ) {
383- return (AnnotatedElement ) hotSpotJDKReflectionGetMirror .invoke (hotSpotJVMCIRuntimeReflection , element );
417+ if (isHotSpotJDKReflectionAvailable ) {
418+ return (AnnotatedElement ) hotSpotJDKReflectionGetMirror .invoke (hotSpotJVMCIRuntimeReflection , element );
419+ } else {
420+ if (element instanceof HotSpotResolvedObjectType ) {
421+ return (AnnotatedElement ) hotSpotResolvedObjectTypeImplMirror .invoke (element );
422+ }
423+ return (AnnotatedElement ) hotSpotResolvedPrimitiveTypeMirror .invoke (element );
424+ }
384425 } else if (element instanceof HotSpotResolvedJavaMethod ) {
385426 if (((ResolvedJavaMethod ) element ).isClassInitializer ()) {
386427 return null ;
387428 }
388- return (AnnotatedElement ) hotSpotJDKReflectionGetMethod .invoke (hotSpotJVMCIRuntimeReflection , element );
429+ if (isHotSpotJDKReflectionAvailable ) {
430+ return (AnnotatedElement ) hotSpotJDKReflectionGetMethod .invoke (hotSpotJVMCIRuntimeReflection , element );
431+ } else {
432+ return (AnnotatedElement ) hotSpotResolvedJavaMethodImplToJava .invoke (element );
433+ }
389434 } else if (element instanceof HotSpotResolvedJavaField ) {
390- return (AnnotatedElement ) hotSpotJDKReflectionGetField .invoke (hotSpotJVMCIRuntimeReflection , element );
435+ if (isHotSpotJDKReflectionAvailable ) {
436+ return (AnnotatedElement ) hotSpotJDKReflectionGetField .invoke (hotSpotJVMCIRuntimeReflection , element );
437+ } else {
438+ return (AnnotatedElement ) hotSpotResolvedJavaFieldImplToJava .invoke (element );
439+ }
391440 } else if (element instanceof AnnotationWrapper ) {
392441 return getRoot (((AnnotationWrapper ) element ).getAnnotationRoot ());
393442 }
0 commit comments