private void applyFeatures() { try { for (Class<? extends Annotation> featureAnnotation : features) { boolean isFeatureSupported = ReflectionUtil.isAnnotationPresentInHierarchy(originalTransferManager.getClass(), featureAnnotation); if (isFeatureSupported) { Class<? extends TransferManager> featureTransferManagerClass = getFeatureTransferManagerClass(featureAnnotation); wrappedTransferManager = apply(wrappedTransferManager, featureTransferManagerClass, featureAnnotation); } else { logger.log(Level.INFO, "- SKIPPING unsupported optional feature " + featureAnnotation.getSimpleName()); } } } catch (IllegalAccessException | InvocationTargetException | InstantiationException e) { throw new RuntimeException("Unable to annotate TransferManager with feature.", e); } }