diff --git a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/Methods.java b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/Methods.java index 8b75e3611a4768..2721568955d0e8 100644 --- a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/Methods.java +++ b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/Methods.java @@ -2,12 +2,14 @@ import static io.quarkus.arc.processor.IndexClassLookupUtils.getClassByName; +import io.quarkus.gizmo.DescriptorUtils; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.function.BiFunction; import java.util.function.Consumer; @@ -122,7 +124,7 @@ static void addInterceptedMethodCandidates(BeanDeployment beanDeployment, ClassI Map> candidates, List classLevelBindings, Consumer bytecodeTransformerConsumer) { - Set methodsFromWhichToRemoveFinal = new HashSet<>(); + Set methodsFromWhichToRemoveFinal = new HashSet<>(); for (MethodInfo method : classInfo.methods()) { if (skipForSubclass(method)) { continue; @@ -143,7 +145,7 @@ static void addInterceptedMethodCandidates(BeanDeployment beanDeployment, ClassI if (Modifier.isFinal(method.flags())) { String className = method.declaringClass().name().toString(); if (!className.startsWith("java.")) { - methodsFromWhichToRemoveFinal.add(method.name()); + methodsFromWhichToRemoveFinal.add(NameAndDescriptor.fromMethodInfo(method)); } } candidates.computeIfAbsent(new Methods.MethodKey(method), key -> merged); @@ -158,7 +160,7 @@ public ClassVisitor apply(String s, ClassVisitor classVisitor) { @Override public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { - if (methodsFromWhichToRemoveFinal.contains(name)) { + if (methodsFromWhichToRemoveFinal.contains(new NameAndDescriptor(name, descriptor))) { access = access & (~Opcodes.ACC_FINAL); } return super.visitMethod(access, name, descriptor, signature, exceptions); @@ -176,6 +178,43 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str } } + private static class NameAndDescriptor { + private final String name; + private final String descriptor; + + public NameAndDescriptor(String name, String descriptor) { + this.name = name; + this.descriptor = descriptor; + } + + public static NameAndDescriptor fromMethodInfo(MethodInfo method) { + String returnTypeDesc = DescriptorUtils.objectToDescriptor(method.returnType().name().toString()); + String[] paramTypesDesc = new String[(method.parameters().size())]; + for (int i = 0; i < method.parameters().size(); i++) { + paramTypesDesc[i] = DescriptorUtils.objectToDescriptor(method.parameters().get(i).name().toString()); + } + + return new NameAndDescriptor(method.name(), + DescriptorUtils.methodSignatureToDescriptor(returnTypeDesc, paramTypesDesc)); + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + NameAndDescriptor that = (NameAndDescriptor) o; + return name.equals(that.name) && + descriptor.equals(that.descriptor); + } + + @Override + public int hashCode() { + return Objects.hash(name, descriptor); + } + } + private static boolean skipForSubclass(MethodInfo method) { if (Modifier.isStatic(method.flags())) { return true;