@@ -107,22 +107,57 @@ 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" ,
121-                             Class .forName ("jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl" ));
122-             hotSpotJDKReflectionGetField  = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotJDKReflection" ), "getField" ,
123-                             Class .forName ("jdk.vm.ci.hotspot.HotSpotResolvedJavaFieldImpl" ));
124-         } catch  (ClassNotFoundException  | IllegalAccessException  | InvocationTargetException  e ) {
125-             throw  GraalError .shouldNotReachHere (e );
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" ,
133+                     Class .forName ("jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl" ));
134+             temporaryHotSpotJDKReflectionGetField  = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotJDKReflection" ), "getField" ,
135+                     Class .forName ("jdk.vm.ci.hotspot.HotSpotResolvedJavaFieldImpl" ));
136+         } catch  (ClassNotFoundException  | IllegalAccessException  | InvocationTargetException  |
137+                  ReflectionUtil .ReflectionUtilError  ex  ) {
138+             temporaryIsHotSpotJDKReflectionAvailable  = false ;
139+         }
140+ 
141+         isHotSpotJDKReflectionAvailable  = temporaryIsHotSpotJDKReflectionAvailable ;
142+         hotSpotJVMCIRuntimeReflection  = temporaryHotSpotJVMCIRuntimeReflection ;
143+         hotSpotJDKReflectionGetMirror  = temporaryHotSpotJDKReflectionGetMirror ;
144+         hotSpotJDKReflectionGetMethod  = temporaryHotSpotJDKReflectionGetMethod ;
145+         hotSpotJDKReflectionGetField  = temporaryHotSpotJDKReflectionGetField ;
146+ 
147+         if  (isHotSpotJDKReflectionAvailable ) {
148+             hotSpotResolvedObjectTypeImplMirror  = null ;
149+             hotSpotResolvedPrimitiveTypeMirror  = null ;
150+             hotSpotResolvedJavaMethodImplToJava  = null ;
151+             hotSpotResolvedJavaFieldImplToJava  = null ;
152+         } else  {
153+             try  {
154+                 hotSpotResolvedObjectTypeImplMirror  = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotResolvedObjectTypeImpl" ), "mirror" );
155+                 hotSpotResolvedPrimitiveTypeMirror  = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotResolvedPrimitiveType" ), "mirror" );
156+                 hotSpotResolvedJavaMethodImplToJava  = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl" ), "toJava" );
157+                 hotSpotResolvedJavaFieldImplToJava  = ReflectionUtil .lookupMethod (Class .forName ("jdk.vm.ci.hotspot.HotSpotResolvedJavaFieldImpl" ), "toJava" );
158+             } catch  (ClassNotFoundException  e ) {
159+                 throw  GraalError .shouldNotReachHere (e );
160+             }
126161        }
127162    }
128163
@@ -380,14 +415,29 @@ private static AnnotatedElement getRoot(AnnotatedElement element) {
380415            if  (element  instanceof  Package ) {
381416                return  (Class <?>) packageGetPackageInfo .invoke (element );
382417            } else  if  (element  instanceof  HotSpotResolvedObjectType  || element  instanceof  HotSpotResolvedJavaType ) {
383-                 return  (AnnotatedElement ) hotSpotJDKReflectionGetMirror .invoke (hotSpotJVMCIRuntimeReflection , element );
418+                 if  (isHotSpotJDKReflectionAvailable ) {
419+                     return  (AnnotatedElement ) hotSpotJDKReflectionGetMirror .invoke (hotSpotJVMCIRuntimeReflection , element );
420+                 } else  {
421+                     if  (element  instanceof  HotSpotResolvedObjectType ) {
422+                         return  (AnnotatedElement ) hotSpotResolvedObjectTypeImplMirror .invoke (element );
423+                     }
424+                     return  (AnnotatedElement ) hotSpotResolvedPrimitiveTypeMirror .invoke (element );
425+                 }
384426            } else  if  (element  instanceof  HotSpotResolvedJavaMethod ) {
385427                if  (((ResolvedJavaMethod ) element ).isClassInitializer ()) {
386428                    return  null ;
387429                }
388-                 return  (AnnotatedElement ) hotSpotJDKReflectionGetMethod .invoke (hotSpotJVMCIRuntimeReflection , element );
430+                 if  (isHotSpotJDKReflectionAvailable ) {
431+                     return  (AnnotatedElement ) hotSpotJDKReflectionGetMethod .invoke (hotSpotJVMCIRuntimeReflection , element );
432+                 } else  {
433+                     return  (AnnotatedElement ) hotSpotResolvedJavaMethodImplToJava .invoke (element );
434+                 }
389435            } else  if  (element  instanceof  HotSpotResolvedJavaField ) {
390-                 return  (AnnotatedElement ) hotSpotJDKReflectionGetField .invoke (hotSpotJVMCIRuntimeReflection , element );
436+                 if  (isHotSpotJDKReflectionAvailable ) {
437+                     return  (AnnotatedElement ) hotSpotJDKReflectionGetField .invoke (hotSpotJVMCIRuntimeReflection , element );
438+                 } else  {
439+                     return  (AnnotatedElement ) hotSpotResolvedJavaFieldImplToJava .invoke (element );
440+                 }
391441            } else  if  (element  instanceof  AnnotationWrapper ) {
392442                return  getRoot (((AnnotationWrapper ) element ).getAnnotationRoot ());
393443            }
0 commit comments