Skip to content

Commit

Permalink
MemberName.getParameterTypes no longer available in JDK >= 20+27
Browse files Browse the repository at this point in the history
  • Loading branch information
zakkak committed Jan 12, 2023
1 parent c3c449d commit f03c0d2
Showing 1 changed file with 11 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ public class MethodHandleFeature implements InternalFeature {
private Method memberNameIsMethod;
private Method memberNameIsConstructor;
private Method memberNameIsField;
private Method memberNameGetParameterTypes;
private Method memberNameGetMethodType;
private Method methodTypeParameterArray;
private Field methodHandleInternalForm;
private Field lambdaFormNames;
private Field lambdaFormArity;
Expand Down Expand Up @@ -121,7 +122,10 @@ public void duringSetup(DuringSetupAccess access) {
memberNameIsMethod = ReflectionUtil.lookupMethod(memberNameClass, "isMethod");
memberNameIsConstructor = ReflectionUtil.lookupMethod(memberNameClass, "isConstructor");
memberNameIsField = ReflectionUtil.lookupMethod(memberNameClass, "isField");
memberNameGetParameterTypes = ReflectionUtil.lookupMethod(memberNameClass, "getParameterTypes");
memberNameGetMethodType = ReflectionUtil.lookupMethod(memberNameClass, "getMethodType");

Class<?> methodTypeClass = access.findClassByName("java.lang.invoke.MethodType");
methodTypeParameterArray = ReflectionUtil.lookupMethod(methodTypeClass, "parameterArray");

lambdaFormClass = access.findClassByName("java.lang.invoke.LambdaForm");
lambdaFormNames = ReflectionUtil.lookupField(lambdaFormClass, "names");
Expand Down Expand Up @@ -361,7 +365,11 @@ private void registerMemberName(Object memberName) {
boolean isConstructor = (boolean) memberNameIsConstructor.invoke(memberName);
boolean isField = (boolean) memberNameIsField.invoke(memberName);
String name = (isMethod || isField) ? (String) memberNameGetName.invoke(memberName) : null;
Class<?>[] paramTypes = (isMethod || isConstructor) ? (Class<?>[]) memberNameGetParameterTypes.invoke(memberName) : null;
Class<?>[] paramTypes = null;
if (isMethod || isConstructor) {
MethodType methodType = (MethodType) memberNameGetMethodType.invoke(memberName);
paramTypes = (Class<?>[]) methodTypeParameterArray.invoke(methodType);
}
if (isMethod) {
RuntimeReflection.register(declaringClass.getDeclaredMethod(name, paramTypes));
} else if (isConstructor) {
Expand Down

0 comments on commit f03c0d2

Please sign in to comment.