diff --git a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/BeanGenerator.java b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/BeanGenerator.java index 8a638e6ad37164..975ad9f17b6615 100644 --- a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/BeanGenerator.java +++ b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/BeanGenerator.java @@ -1173,8 +1173,15 @@ protected void implementCreate(ClassOutput classOutput, ClassCreator beanCreator paramTypesArray, declaringProviderInstanceHandle, argsArray)); } else { - create.assign(instanceHandle, create.invokeVirtualMethod(MethodDescriptor.of(producerMethod), - declaringProviderInstanceHandle, referenceHandles)); + ResultHandle invokeMethodHandle; + if (Modifier.isStatic(producerMethod.flags())) { + invokeMethodHandle = create.invokeStaticMethod(MethodDescriptor.of(producerMethod), + referenceHandles); + } else { + invokeMethodHandle = create.invokeVirtualMethod(MethodDescriptor.of(producerMethod), + declaringProviderInstanceHandle, referenceHandles); + } + create.assign(instanceHandle, invokeMethodHandle); } if (bean.getScope().isNormal()) { diff --git a/independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/producer/staticMethod/StaticMethodProducerTest.java b/independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/producer/staticMethod/StaticMethodProducerTest.java new file mode 100644 index 00000000000000..361368a1f69399 --- /dev/null +++ b/independent-projects/arc/tests/src/test/java/io/quarkus/arc/test/producer/staticMethod/StaticMethodProducerTest.java @@ -0,0 +1,51 @@ +package io.quarkus.arc.test.producer.staticMethod; + +import io.quarkus.arc.Arc; +import io.quarkus.arc.InstanceHandle; +import io.quarkus.arc.test.ArcTestContainer; +import javax.enterprise.inject.Produces; +import javax.inject.Singleton; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +/** + * Tests static method producers + */ +public class StaticMethodProducerTest { + + @RegisterExtension + public ArcTestContainer container = new ArcTestContainer(StaticMethodProducerTest.class, SomeProducer.class); + + @Test + public void testStaticProducer() { + InstanceHandle stringInstance = Arc.container().instance(String.class); + Assertions.assertTrue(stringInstance.isAvailable()); + Assertions.assertEquals("foo", stringInstance.get()); + InstanceHandle longInstance = Arc.container().instance(Long.class); + Assertions.assertTrue(longInstance.isAvailable()); + Assertions.assertEquals(2L, longInstance.get()); + InstanceHandle instance = Arc.container().instance(Double.class); + Assertions.assertTrue(instance.isAvailable()); + Assertions.assertEquals(2.1, instance.get()); + } + + @Singleton + static class SomeProducer { + + @Produces + private static Long produceLong() { + return 2L; + } + + @Produces + static String produceString() { + return "foo"; + } + + @Produces + public static Double produceDouble() { + return 2.1; + } + } +}