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;
}