com_baeldung_transactional_TransactionalDetectionUnitTest_java
org.springframework.core.io.support.SpringFactoriesLoader
private static <T> T instantiateFactory(String factoryImplementationName, Class<T> factoryType, ClassLoader classLoader) {
        try {
            Class<?> factoryImplementationClass = ClassUtils.forName(factoryImplementationName, classLoader);
            if (!factoryType.isAssignableFrom(factoryImplementationClass)) {
                throw new IllegalArgumentException("Class [" + factoryImplementationName + "] is not assignable to factory type [" + factoryType.getName() + "]");
            }
            return (T)ReflectionUtils.accessibleConstructor(factoryImplementationClass, new Class[0]).newInstance(new Object[0]);
        }
        catch (Throwable ex) {
            throw new IllegalArgumentException("Unable to instantiate factory class [" + factoryImplementationName + "] for factory type [" + factoryType.getName() + "]", ex);
        }
    }
 -> java.lang.String.length(): int -> java.util.Map.get(java.lang.Object): java.lang.Object -> java.lang.String.endsWith(java.lang.String): boolean -> java.lang.String.startsWith(java.lang.String): boolean -> java.lang.String.startsWith(java.lang.String): boolean -> java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader): java.lang.Class -> java.lang.Class.isAssignableFrom(java.lang.Class): boolean -> java.lang.Class.getDeclaredConstructor(java.lang.Class[]): java.lang.reflect.Constructor -> java.lang.reflect.Constructor.getModifiers(): int -> java.lang.reflect.Modifier.isPublic(int): boolean -> java.lang.reflect.Constructor.isAccessible(): boolean -> java.lang.reflect.Constructor.setAccessible(boolean): void -> java.lang.reflect.Constructor.newInstance(java.lang.Object[]): java.lang.Object -> java.lang.String.length(): int -> java.util.Map.get(java.lang.Object): java.lang.Object -> java.lang.String.endsWith(java.lang.String): boolean -> java.lang.String.startsWith(java.lang.String): boolean -> java.lang.String.startsWith(java.lang.String): boolean -> java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader): java.lang.Class -> java.lang.String.lastIndexOf(int): int -> java.lang.String.substring(int,int): java.lang.String -> java.lang.StringBuilder.append(java.lang.String): java.lang.StringBuilder -> java.lang.StringBuilder.append(char): java.lang.StringBuilder -> java.lang.String.substring(int): java.lang.String -> java.lang.StringBuilder.append(java.lang.String): java.lang.StringBuilder -> java.lang.StringBuilder.toString(): java.lang.String -> java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader): java.lang.Class
 [CALL] [CALL] [CALL] [EXIT] [CALL] -> java.lang.String.length(): int [EXIT] -> java.util.Map.get(java.lang.Object): java.lang.Object -> java.lang.String.endsWith(java.lang.String): boolean -> java.lang.String.startsWith(java.lang.String): boolean -> java.lang.String.startsWith(java.lang.String): boolean -> java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader): java.lang.Class [EXIT] -> java.lang.Class.isAssignableFrom(java.lang.Class): boolean [CALL] -> java.lang.Class.getDeclaredConstructor(java.lang.Class[]): java.lang.reflect.Constructor [CALL] -> java.lang.reflect.Constructor.getModifiers(): int -> java.lang.reflect.Modifier.isPublic(int): boolean -> java.lang.reflect.Constructor.isAccessible(): boolean -> java.lang.reflect.Constructor.setAccessible(boolean): void [EXIT] [EXIT] -> java.lang.reflect.Constructor.newInstance(java.lang.Object[]): java.lang.Object [CALL] [CALL] [CALL] [EXIT] [CALL] -> java.lang.String.length(): int [EXIT] -> java.util.Map.get(java.lang.Object): java.lang.Object -> java.lang.String.endsWith(java.lang.String): boolean -> java.lang.String.startsWith(java.lang.String): boolean -> java.lang.String.startsWith(java.lang.String): boolean -> java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader): java.lang.Class -> java.lang.String.lastIndexOf(int): int -> java.lang.String.substring(int,int): java.lang.String -> java.lang.StringBuilder.append(java.lang.String): java.lang.StringBuilder -> java.lang.StringBuilder.append(char): java.lang.StringBuilder -> java.lang.String.substring(int): java.lang.String -> java.lang.StringBuilder.append(java.lang.String): java.lang.StringBuilder -> java.lang.StringBuilder.toString(): java.lang.String -> java.lang.Class.forName(java.lang.String,boolean,java.lang.ClassLoader): java.lang.Class [EXIT] [EXIT] [EXIT]