diff --git a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/BeanInfo.java b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/BeanInfo.java index 43a6b4647ff264..7de54b7a4acf31 100644 --- a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/BeanInfo.java +++ b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/BeanInfo.java @@ -535,7 +535,8 @@ private Map initDecoratedMethods() { Map candidates = new HashMap<>(); addDecoratedMethods(candidates, target.get().asClass(), bound, - new SubclassSkipPredicate(beanDeployment.getAssignabilityCheck()::isAssignableFrom)); + new SubclassSkipPredicate(beanDeployment.getAssignabilityCheck()::isAssignableFrom, + beanDeployment.getBeanArchiveIndex())); Map decoratedMethods = new HashMap<>(candidates.size()); for (Entry entry : candidates.entrySet()) { 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 fea42a8b7725af..1f859fc88c0e51 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 @@ -161,7 +161,9 @@ static Set addInterceptedMethodCandidates(BeanDeployment beanDeploym boolean transformUnproxyableClasses) { return addInterceptedMethodCandidates(beanDeployment, classInfo, candidates, classLevelBindings, bytecodeTransformerConsumer, transformUnproxyableClasses, - new SubclassSkipPredicate(beanDeployment.getAssignabilityCheck()::isAssignableFrom), false); + new SubclassSkipPredicate(beanDeployment.getAssignabilityCheck()::isAssignableFrom, + beanDeployment.getBeanArchiveIndex()), + false); } static Set addInterceptedMethodCandidates(BeanDeployment beanDeployment, ClassInfo classInfo, @@ -454,12 +456,14 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str static class SubclassSkipPredicate implements Predicate { private final BiFunction assignableFromFun; + private final IndexView beanArchiveIndex; private ClassInfo clazz; private List regularMethods; private Set bridgeMethods = new HashSet<>(); - public SubclassSkipPredicate(BiFunction assignableFromFun) { + public SubclassSkipPredicate(BiFunction assignableFromFun, IndexView beanArchiveIndex) { this.assignableFromFun = assignableFromFun; + this.beanArchiveIndex = beanArchiveIndex; } void startProcessing(ClassInfo clazz) { @@ -505,6 +509,20 @@ public boolean test(MethodInfo method) { // Do not skip default methods - public non-abstract instance methods declared in an interface return false; } + + List parameters = method.parameters(); + if (!parameters.isEmpty() && (beanArchiveIndex != null)) { + for (Type type : parameters) { + ClassInfo parameterClassInfo = beanArchiveIndex.getClassByName(type.name()); + if (parameterClassInfo == null) { + continue; // hope for the best + } + if (!Modifier.isPublic(parameterClassInfo.flags())) { + return true; // if the parameter is not public, we end up with IllegalAccessError when trying to access the use the load the class + } + } + } + // Note that we intentionally do not skip final methods here - these are handled later return false; } diff --git a/independent-projects/arc/processor/src/test/java/io/quarkus/arc/processor/SubclassSkipPredicateTest.java b/independent-projects/arc/processor/src/test/java/io/quarkus/arc/processor/SubclassSkipPredicateTest.java index c7b0cb88cd9391..511cd8f78fe06b 100644 --- a/independent-projects/arc/processor/src/test/java/io/quarkus/arc/processor/SubclassSkipPredicateTest.java +++ b/independent-projects/arc/processor/src/test/java/io/quarkus/arc/processor/SubclassSkipPredicateTest.java @@ -21,7 +21,7 @@ public class SubclassSkipPredicateTest { public void testPredicate() throws IOException { IndexView index = Basics.index(Base.class, Submarine.class, Long.class, Number.class); AssignabilityCheck assignabilityCheck = new AssignabilityCheck(index, null); - SubclassSkipPredicate predicate = new SubclassSkipPredicate(assignabilityCheck::isAssignableFrom); + SubclassSkipPredicate predicate = new SubclassSkipPredicate(assignabilityCheck::isAssignableFrom, null); ClassInfo submarineClass = index.getClassByName(DotName.createSimple(Submarine.class.getName())); predicate.startProcessing(submarineClass);