void registerReflectiveClasses()

in extensions/js-dsl/deployment/src/main/java/org/apache/camel/quarkus/dsl/js/deployment/JavaScriptDslProcessor.java [128:217]


    void registerReflectiveClasses(
            BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
            BuildProducer<ReflectiveMethodBuildItem> reflectiveMethods,
            CombinedIndexBuildItem combinedIndexBuildItem) {

        IndexView view = combinedIndexBuildItem.getIndex();

        for (Class<?> type : CAMEL_REFLECTIVE_CLASSES) {
            DotName name = DotName.createSimple(type.getName());

            if (type.isInterface()) {
                for (ClassInfo info : view.getAllKnownImplementors(name)) {
                    reflectiveClass.produce(
                            ReflectiveClassBuildItem.builder(info.name().toString()).methods().build());
                }
            } else {
                for (ClassInfo info : view.getAllKnownSubclasses(name)) {
                    reflectiveClass.produce(
                            ReflectiveClassBuildItem.builder(info.name().toString()).methods().build());
                }
            }

            reflectiveClass.produce(
                    ReflectiveClassBuildItem.builder(type)
                            .constructors(true)
                            .methods(true)
                            .fields(type.isEnum())
                            .build());
        }

        for (Class<?> type : JAVA_CLASSES) {
            reflectiveClass.produce(ReflectiveClassBuildItem.builder(type).methods().build());
        }

        reflectiveClass.produce(ReflectiveClassBuildItem.builder(Components.class).methods().build());
        reflectiveClass.produce(ReflectiveClassBuildItem.builder(JavaScriptDSL.class).fields().build());
        reflectiveClass.produce(ReflectiveClassBuildItem.builder("org.apache.camel.converter.jaxp.XmlConverter").methods()
                .build());

        Set<String> existingComponents = view.getAllKnownImplementors(Component.class)
                .stream()
                .map(JavaScriptDslProcessor::extractName)
                .collect(Collectors.toSet());

        Set<Class<?>> types = new HashSet<>();
        // Register all public methods of JavaScriptDSL for reflection to be accessible in native mode from a JavaScript resource
        for (Method method : JavaScriptDSL.class.getMethods()) {
            Class<?> declaringClass = method.getDeclaringClass();
            if (!declaringClass.equals(Object.class)) {
                String declaringClassName = declaringClass.getSimpleName();
                // Keep only the methods that are not from builder classes or that are from builder classes of included
                // components
                if (!declaringClassName.endsWith(BUILDER_CLASS_SUFFIX) || existingComponents.contains(
                        declaringClassName.substring(0, declaringClassName.length() - BUILDER_CLASS_SUFFIX.length()))) {
                    Class<?> returnType = method.getReturnType();
                    types.add(returnType);
                    reflectiveMethods.produce(new ReflectiveMethodBuildItem(method));
                    if (declaringClassName.endsWith(BUILDER_CLASS_SUFFIX)) {
                        // Add the return type of the advanced method if any
                        Arrays.stream(returnType.getMethods())
                                .filter(m -> m.getName().equals("advanced") && m.getParameterTypes().length == 0)
                                .findAny()
                                .ifPresent(m -> types.add(m.getReturnType()));
                    }
                }
            }
        }
        // Register all the Camel return types of public methods of the camel reflective classes for reflection to
        // be accessible in native mode from a JavaScript resource
        for (Class<?> c : CAMEL_REFLECTIVE_CLASSES) {
            for (Method method : c.getMethods()) {
                if (!method.getDeclaringClass().equals(Object.class)) {
                    Class<?> returnType = method.getReturnType();
                    if (returnType.getPackageName().startsWith("org.apache.camel.")
                            && !CAMEL_REFLECTIVE_CLASSES.contains(returnType)) {
                        types.add(returnType);
                    }
                }
            }
        }
        // Allow access to methods by reflection to be accessible in native mode from a JavaScript resource
        reflectiveClass.produce(ReflectiveClassBuildItem.builder(types.toArray(new Class<?>[0])).constructors(false)
                .methods().build());
        // Register for reflection the runtime implementation of the main functional interfaces.
        reflectiveClass.produce(
                ReflectiveClassBuildItem.builder(JavaScriptDslBiConsumer.class, JavaScriptDslBiFunction.class,
                        JavaScriptDslBiPredicate.class, JavaScriptDslConsumer.class, JavaScriptDslFunction.class,
                        JavaScriptDslPredicate.class, org.apache.camel.quarkus.dsl.js.runtime.JavaScriptDslProcessor.class,
                        JavaScriptDslSupplier.class).build());
    }