public static synchronized List getInstances()

in testing/multiton/src/main/java/org/apache/axiom/testing/multiton/Multiton.java [86:136]


    public static synchronized <T extends Multiton> List<T> getInstances(Class<T> multitonClass) {
        List<T> instances = (List<T>) instancesMap.get(multitonClass);
        if (instances == null) {
            instances = new ArrayList<>();
            for (Field field : multitonClass.getDeclaredFields()) {
                int mod = field.getModifiers();
                if (Modifier.isPublic(mod)
                        && Modifier.isStatic(mod)
                        && Modifier.isFinal(mod)
                        && multitonClass.isAssignableFrom(field.getType())) {
                    try {
                        instances.add(multitonClass.cast(field.get(null)));
                    } catch (IllegalAccessException ex) {
                        throw new MultitonInstantiationException(ex);
                    }
                }
            }
            for (Method method : multitonClass.getDeclaredMethods()) {
                if (method.getAnnotation(Instances.class) != null) {
                    int mod = method.getModifiers();
                    if (!Modifier.isPrivate(mod) || !Modifier.isStatic(mod)) {
                        throw new MultitonInstantiationException(
                                "Methods annotated with @Instances must be private static");
                    }
                    if (method.getParameterTypes().length > 0) {
                        throw new MultitonInstantiationException(
                                "Methods annotated with @Instances must not take any parameters");
                    }
                    Class<?> returnType = method.getReturnType();
                    if (!returnType.isArray()
                            || !multitonClass.isAssignableFrom(returnType.getComponentType())) {
                        throw new MultitonInstantiationException(
                                "Invalid return type for method annotated with @Instances");
                    }
                    method.setAccessible(true);
                    try {
                        for (Object instance : (Object[]) method.invoke(null)) {
                            instances.add(multitonClass.cast(instance));
                        }
                    } catch (IllegalAccessException ex) {
                        throw new MultitonInstantiationException(ex);
                    } catch (InvocationTargetException ex) {
                        throw new MultitonInstantiationException(ex.getCause());
                    }
                }
            }
            instances = Collections.unmodifiableList(instances);
            instancesMap.put(multitonClass, instances);
        }
        return instances;
    }