@@ -635,23 +635,35 @@ private static boolean hasDefaultValue(Field annotatedField) {
635
635
636
636
private void handleDeletedClass (Class <?> originalClass , Delete deleteAnnotation ) {
637
637
if (NativeImageOptions .ReportUnsupportedElementsAtRuntime .getValue ()) {
638
+ ResolvedJavaType type = metaAccess .lookupJavaType (originalClass );
639
+
640
+ try {
641
+ type .link ();
642
+ } catch (LinkageError ignored ) {
643
+ /*
644
+ * Ignore any linking errors. A type that cannot be linked doesn't need elements
645
+ * replaced: it will simply fail at runtime with the same linkage error before
646
+ * reaching those elements.
647
+ */
648
+ return ;
649
+ }
650
+
638
651
/*
639
652
* We register all methods and fields as deleted. That still allows usage of the type in
640
653
* type checks.
641
654
*/
642
- for (Executable m : originalClass .getDeclaredMethods ()) {
643
- ResolvedJavaMethod method = metaAccess .lookupJavaMethod (m );
655
+ for (ResolvedJavaMethod method : type .getDeclaredMethods ()) {
644
656
registerAsDeleted (null , method , deleteAnnotation );
645
657
}
646
- for (Executable m : originalClass .getDeclaredConstructors ()) {
647
- ResolvedJavaMethod method = metaAccess .lookupJavaMethod (m );
648
- registerAsDeleted (null , method , deleteAnnotation );
658
+ for (ResolvedJavaMethod constructor : type .getDeclaredConstructors ()) {
659
+ registerAsDeleted (null , constructor , deleteAnnotation );
649
660
}
650
- for (Field f : originalClass .getDeclaredFields ()) {
651
- ResolvedJavaField field = metaAccess .lookupJavaField (f );
652
- registerAsDeleted (null , field , deleteAnnotation );
661
+ for (ResolvedJavaField f : type .getInstanceFields (false )) {
662
+ registerAsDeleted (null , f , deleteAnnotation );
663
+ }
664
+ for (ResolvedJavaField f : type .getStaticFields ()) {
665
+ registerAsDeleted (null , f , deleteAnnotation );
653
666
}
654
-
655
667
} else {
656
668
deleteAnnotations .put (metaAccess .lookupJavaType (originalClass ), deleteAnnotation );
657
669
}
0 commit comments