Skip to content

Commit d02b3b6

Browse files
committed
Register Object methods for reflective queries
1 parent a0316f8 commit d02b3b6

File tree

4 files changed

+42
-4
lines changed

4 files changed

+42
-4
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/target/ExecutableAccessorComputer.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
*/
2525
package com.oracle.svm.core.reflect.target;
2626

27+
import static com.oracle.svm.core.MissingRegistrationUtils.throwMissingRegistrationErrors;
28+
2729
import java.lang.reflect.Executable;
2830

2931
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
@@ -48,6 +50,14 @@ public Object transform(Object receiver, Object originalValue) {
4850
*/
4951
return originalValue;
5052
}
51-
return ReflectionSubstitutionSupport.singleton().getOrCreateAccessor((Executable) receiver);
53+
if (throwMissingRegistrationErrors()) {
54+
/*
55+
* We do not want to register a heap executable which wasn't explicitly registered for
56+
* reflection.
57+
*/
58+
return ReflectionSubstitutionSupport.singleton().getAccessor((Executable) receiver);
59+
} else {
60+
return ReflectionSubstitutionSupport.singleton().getOrCreateAccessor((Executable) receiver);
61+
}
5262
}
5363
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/target/ReflectionSubstitutionSupport.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ static ReflectionSubstitutionSupport singleton() {
3939
return ImageSingletons.lookup(ReflectionSubstitutionSupport.class);
4040
}
4141

42+
SubstrateAccessor getAccessor(Executable member);
43+
4244
SubstrateAccessor getOrCreateAccessor(Executable member);
4345

4446
SubstrateAccessor getOrCreateConstructorAccessor(Class<?> targetClass, Executable member);

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,21 @@ public void registerAllClassesQuery(ConfigurationCondition condition, Class<?> c
226226
});
227227
}
228228

229+
void registerClassMetadata(ConfigurationCondition condition, Class<?> clazz) {
230+
registerAllDeclaredFieldsQuery(condition, true, clazz);
231+
registerAllFieldsQuery(condition, true, clazz);
232+
registerAllDeclaredMethodsQuery(condition, true, clazz);
233+
registerAllMethodsQuery(condition, true, clazz);
234+
registerAllDeclaredConstructorsQuery(condition, true, clazz);
235+
registerAllConstructorsQuery(condition, true, clazz);
236+
registerAllDeclaredClassesQuery(condition, clazz);
237+
registerAllClassesQuery(condition, clazz);
238+
registerAllRecordComponentsQuery(condition, clazz);
239+
registerAllPermittedSubclassesQuery(condition, clazz);
240+
registerAllNestMembersQuery(condition, clazz);
241+
registerAllSignersQuery(condition, clazz);
242+
}
243+
229244
/**
230245
* Runtime conditions can only be used with type, so they are not valid here.
231246
*/
@@ -1161,10 +1176,10 @@ public Map<Class<?>, Set<Class<?>>> getReflectionInnerClasses() {
11611176
public int getEnabledReflectionQueries(Class<?> clazz) {
11621177
int enabledQueries = enabledQueriesFlags.getOrDefault(clazz, 0);
11631178
/*
1164-
* Primitives, arrays and object are registered by default since they provide reflective
1165-
* access to either no members or only Object methods.
1179+
* Primitives and arrays are registered by default since they provide reflective access to
1180+
* no members.
11661181
*/
1167-
if (clazz == Object.class || clazz.isPrimitive() || clazz.isArray()) {
1182+
if (clazz.isPrimitive() || clazz.isArray()) {
11681183
enabledQueries |= ALL_DECLARED_CLASSES_FLAG | ALL_CLASSES_FLAG | ALL_DECLARED_CONSTRUCTORS_FLAG | ALL_CONSTRUCTORS_FLAG | ALL_DECLARED_METHODS_FLAG | ALL_METHODS_FLAG |
11691184
ALL_DECLARED_FIELDS_FLAG | ALL_FIELDS_FLAG;
11701185
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ private record AccessorKey(Executable member, Class<?> targetClass) {
143143

144144
FeatureImpl.BeforeAnalysisAccessImpl analysisAccess;
145145

146+
@Override
147+
public SubstrateAccessor getAccessor(Executable member) {
148+
return accessors.get(new AccessorKey(member, member.getDeclaringClass()));
149+
}
150+
146151
@Override
147152
public SubstrateAccessor getOrCreateAccessor(Executable member) {
148153
return getOrCreateConstructorAccessor(member.getDeclaringClass(), member);
@@ -295,6 +300,12 @@ public void afterRegistration(AfterRegistrationAccess access) {
295300
reflectionData = new ReflectionDataBuilder((SubstrateAnnotationExtractor) ImageSingletons.lookup(AnnotationExtractor.class));
296301
ImageSingletons.add(RuntimeReflectionSupport.class, reflectionData);
297302
ImageSingletons.add(ReflectionHostedSupport.class, reflectionData);
303+
304+
/*
305+
* Querying Object members is allowed to enable these accesses on array classes, since those
306+
* don't define any additional members.
307+
*/
308+
reflectionData.registerClassMetadata(ConfigurationCondition.alwaysTrue(), Object.class);
298309
}
299310

300311
@Override

0 commit comments

Comments
 (0)