|
27 | 27 | import java.lang.reflect.Executable; |
28 | 28 | import java.lang.reflect.Field; |
29 | 29 | import java.lang.reflect.RecordComponent; |
| 30 | +import java.util.Map; |
30 | 31 | import java.util.Objects; |
| 32 | +import java.util.concurrent.ConcurrentHashMap; |
31 | 33 |
|
32 | 34 | import org.graalvm.nativeimage.Platform; |
33 | 35 | import org.graalvm.nativeimage.Platforms; |
@@ -72,20 +74,25 @@ public static Providers getOriginalProviders() { |
72 | 74 | return originalProviders; |
73 | 75 | } |
74 | 76 |
|
| 77 | + private static final Map<Class<?>, ResolvedJavaType> typeCache = new ConcurrentHashMap<>(); |
| 78 | + private static final Map<Executable, ResolvedJavaMethod> methodCache = new ConcurrentHashMap<>(); |
| 79 | + private static final Map<Field, ResolvedJavaField> fieldCache = new ConcurrentHashMap<>(); |
| 80 | + private static final Map<RecordComponent, ResolvedJavaRecordComponent> recordCache = new ConcurrentHashMap<>(); |
| 81 | + |
75 | 82 | public static ResolvedJavaType lookupType(Class<?> cls) { |
76 | | - return originalProviders.getMetaAccess().lookupJavaType(cls); |
| 83 | + return typeCache.computeIfAbsent(cls, c -> originalProviders.getMetaAccess().lookupJavaType(cls)); |
77 | 84 | } |
78 | 85 |
|
79 | 86 | public static ResolvedJavaMethod lookupMethod(Executable exe) { |
80 | | - return originalProviders.getMetaAccess().lookupJavaMethod(exe); |
| 87 | + return methodCache.computeIfAbsent(exe, e -> originalProviders.getMetaAccess().lookupJavaMethod(e)); |
81 | 88 | } |
82 | 89 |
|
83 | 90 | public static ResolvedJavaField lookupField(Field field) { |
84 | | - return originalProviders.getMetaAccess().lookupJavaField(field); |
| 91 | + return fieldCache.computeIfAbsent(field, f -> originalProviders.getMetaAccess().lookupJavaField(f)); |
85 | 92 | } |
86 | 93 |
|
87 | 94 | public static ResolvedJavaRecordComponent lookupRecordComponent(RecordComponent rc) { |
88 | | - return originalProviders.getMetaAccess().lookupJavaRecordComponent(rc); |
| 95 | + return recordCache.computeIfAbsent(rc, r -> originalProviders.getMetaAccess().lookupJavaRecordComponent(rc)); |
89 | 96 | } |
90 | 97 |
|
91 | 98 | public static SnippetReflectionProvider getOriginalSnippetReflection() { |
|
0 commit comments