Skip to content

Commit e45b052

Browse files
committed
[GR-66194] Ignore serialization constructors for reflection
PullRequest: graal/21214
2 parents f5a4acd + 85311e8 commit e45b052

File tree

3 files changed

+25
-0
lines changed

3 files changed

+25
-0
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
*/
2525
package com.oracle.svm.core.reflect.target;
2626

27+
import java.lang.reflect.Constructor;
2728
import java.lang.reflect.Executable;
2829
import java.lang.reflect.Field;
2930

@@ -52,4 +53,6 @@ static ReflectionSubstitutionSupport singleton() {
5253
* deleted.
5354
*/
5455
String getDeletionReason(Field field);
56+
57+
boolean isCustomSerializationConstructor(Constructor<?> reflectConstructor);
5558
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import static com.oracle.svm.core.configure.ConfigurationFiles.Options.TreatAllTypeReachableConditionsAsTypeReached;
4141

4242
import java.lang.reflect.AnnotatedElement;
43+
import java.lang.reflect.Constructor;
4344
import java.lang.reflect.Executable;
4445
import java.lang.reflect.Field;
4546
import java.lang.reflect.GenericArrayType;
@@ -87,6 +88,7 @@
8788
import com.oracle.svm.core.hub.ClassForNameSupport;
8889
import com.oracle.svm.core.hub.DynamicHub;
8990
import com.oracle.svm.core.reflect.SubstrateAccessor;
91+
import com.oracle.svm.core.reflect.target.ReflectionSubstitutionSupport;
9092
import com.oracle.svm.core.util.VMError;
9193
import com.oracle.svm.hosted.ClassLoaderFeature;
9294
import com.oracle.svm.hosted.ConditionalConfigurationRegistry;
@@ -1243,6 +1245,15 @@ public void registerHeapReflectionField(Field reflectField, ScanReason reason) {
12431245

12441246
@Override
12451247
public void registerHeapReflectionExecutable(Executable reflectExecutable, ScanReason reason) {
1248+
if (reflectExecutable instanceof Constructor<?> reflectConstructor && ReflectionSubstitutionSupport.singleton().isCustomSerializationConstructor(reflectConstructor)) {
1249+
/*
1250+
* Constructors created by Constructor.newWithAccessor are indistinguishable from an
1251+
* equivalent constructor with a "correct" accessor, and as such could hide this
1252+
* constructor from reflection queries. We therefore exclude such constructors from the
1253+
* internal reflection metadata.
1254+
*/
1255+
return;
1256+
}
12461257
AnalysisMethod analysisMethod = metaAccess.lookupJavaMethod(reflectExecutable);
12471258
if (heapMethods.put(analysisMethod, reflectExecutable) == null) {
12481259
if (sealed) {

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
@@ -50,6 +50,7 @@
5050

5151
import com.oracle.graal.pointsto.ObjectScanner;
5252
import com.oracle.graal.pointsto.infrastructure.UniverseMetaAccess;
53+
import com.oracle.graal.pointsto.meta.AnalysisMetaAccess;
5354
import com.oracle.graal.pointsto.meta.AnalysisMethod;
5455
import com.oracle.graal.pointsto.meta.AnalysisUniverse;
5556
import com.oracle.svm.configure.ConfigurationFile;
@@ -270,6 +271,16 @@ private MethodPointer asMethodPointer(ResolvedJavaMethod method) {
270271
return new MethodPointer(aMethod);
271272
}
272273

274+
@Override
275+
public boolean isCustomSerializationConstructor(Constructor<?> reflectConstructor) {
276+
if (ReflectionUtil.readField(Constructor.class, "constructorAccessor", reflectConstructor) instanceof SubstrateConstructorAccessor accessor) {
277+
AnalysisMetaAccess analysisMetaAccess = analysisAccess.getMetaAccess();
278+
AnalysisMethod analysisConstructor = analysisMetaAccess.lookupJavaMethod(reflectConstructor);
279+
return !accessor.getFactoryMethod().equals(FactoryMethodSupport.singleton().lookup(analysisMetaAccess, analysisConstructor, analysisConstructor.getDeclaringClass(), false));
280+
}
281+
return false;
282+
}
283+
273284
@Override
274285
public List<Class<? extends Feature>> getRequiredFeatures() {
275286
return List.of(ClassForNameSupportFeature.class, DynamicProxyFeature.class);

0 commit comments

Comments
 (0)