Skip to content

Support alias of super-class methods in substitutions #2458

@sdeleuze

Description

@sdeleuze

While working on Spring support for GraalVM native, I found a blocking limitation in substitutions. It seems currently not supported to create an alias for a method invoking a method originally defined in a super class.

It is annoying when the said method is long, and it is blocking when for example your want to access a private field via a public/protected/package private getter. Most of my use case are substitutions to remove some code in order to reduce the memory footprint (typically XML support).

If you consider following code:

public class Foo extends Bar {
	public Foo() {
		method1();
		method2();
	}
}

public class Bar {
	public void method1() {
		// ...
	}
	public void method2() {
		// ...
	}
}

@TargetClass(className = "Foo")
public final class Target_Foo {
	@Substitute
	public Target_Foo() {
		method2();
	}
	@Alias
	public void method2() {
	}
}

It currently fails (tested with 20.1 branch) with following error:

Error: could not find target method: public void Target_Foo.method2()
com.oracle.svm.core.util.UserError$UserException: could not find target method: public void Target_Foo.method2()
	at com.oracle.svm.core.util.UserError.abort(UserError.java:68)
	at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.findOriginalMethod(AnnotationSubstitutionProcessor.java:637)
	at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.handleMethodInAliasClass(AnnotationSubstitutionProcessor.java:330)
	at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.handleAliasClass(AnnotationSubstitutionProcessor.java:302)
	at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.handleClass(AnnotationSubstitutionProcessor.java:274)
	at com.oracle.svm.hosted.substitute.AnnotationSubstitutionProcessor.init(AnnotationSubstitutionProcessor.java:230)
	at com.oracle.svm.hosted.NativeImageGenerator.createDeclarativeSubstitutionProcessor(NativeImageGenerator.java:908)

I would expect such substitution works as expected, like it does when all methods are defined in the same class.

Please tag this issue with the spring label.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions