|
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; |
@@ -82,20 +84,25 @@ public static Providers getOriginalProviders() { |
82 | 84 | return originalProviders; |
83 | 85 | } |
84 | 86 |
|
| 87 | + private static final Map<Class<?>, ResolvedJavaType> typeCache = new ConcurrentHashMap<>(); |
| 88 | + private static final Map<Executable, ResolvedJavaMethod> methodCache = new ConcurrentHashMap<>(); |
| 89 | + private static final Map<Field, ResolvedJavaField> fieldCache = new ConcurrentHashMap<>(); |
| 90 | + private static final Map<RecordComponent, ResolvedJavaRecordComponent> recordCache = new ConcurrentHashMap<>(); |
| 91 | + |
85 | 92 | public static ResolvedJavaType lookupType(Class<?> cls) { |
86 | | - return originalProviders.getMetaAccess().lookupJavaType(cls); |
| 93 | + return typeCache.computeIfAbsent(cls, c -> originalProviders.getMetaAccess().lookupJavaType(cls)); |
87 | 94 | } |
88 | 95 |
|
89 | 96 | public static ResolvedJavaMethod lookupMethod(Executable exe) { |
90 | | - return originalProviders.getMetaAccess().lookupJavaMethod(exe); |
| 97 | + return methodCache.computeIfAbsent(exe, e -> originalProviders.getMetaAccess().lookupJavaMethod(e)); |
91 | 98 | } |
92 | 99 |
|
93 | 100 | public static ResolvedJavaField lookupField(Field field) { |
94 | | - return originalProviders.getMetaAccess().lookupJavaField(field); |
| 101 | + return fieldCache.computeIfAbsent(field, f -> originalProviders.getMetaAccess().lookupJavaField(f)); |
95 | 102 | } |
96 | 103 |
|
97 | 104 | public static ResolvedJavaRecordComponent lookupRecordComponent(RecordComponent rc) { |
98 | | - return originalProviders.getMetaAccess().lookupJavaRecordComponent(rc); |
| 105 | + return recordCache.computeIfAbsent(rc, r -> originalProviders.getMetaAccess().lookupJavaRecordComponent(rc)); |
99 | 106 | } |
100 | 107 |
|
101 | 108 | public static SnippetReflectionProvider getOriginalSnippetReflection() { |
|
0 commit comments