Comment puis-je rechercher dans une base de code java des interfaces qui ont une seule méthode?
Un projet sur lequel je travaille est récemment passé de Java 7 à Java 8. J'aimerais pouvoir trouver des interfaces qui ont une seule méthode abstraite comme candidats pour introduire des interfaces fonctionnelles dans notre base de code. (Annoter les interfaces existantes comme @FunctionalInterface
, les étendre à partir des interfaces dans java.util.function
, ou éventuellement simplement les remplacer).
5
1 answers
Le projet reflections est capable de localiser et de renvoyer toutes les classes sur le chemin de classe. Voici un exemple de travail:
ReflectionUtils.forNames(new Reflections(new ConfigurationBuilder().setScanners(new SubTypesScanner(false))
.addUrls(ClasspathHelper.forClassLoader()))
.getAllTypes()).stream()
.filter(Class::isInterface)
.collect(toMap(c -> c,
c -> Arrays.stream(c.getMethods())
.filter(m -> !m.isDefault())
.filter(m -> !Modifier.isStatic(m.getModifiers()))
.filter(m -> !isObjectMethod(m))
.collect(toSet())))
.entrySet().stream()
.filter(e -> e.getValue().size() == 1)
.sorted(comparing(e -> e.getKey().toString()))
.map(e -> e.getKey().toString() + " has single method " + e.getValue())//getOnlyElement(e.getValue()))
.forEachOrdered(System.out::println);
L'assistant isObjectMethod
est défini comme ceci:
private static final Set<Method> OBJECT_METHODS = ImmutableSet.copyOf(Object.class.getMethods());
private static boolean isObjectMethod(Method m){
return OBJECT_METHODS.stream()
.anyMatch(om -> m.getName().equals(om.getName()) &&
m.getReturnType().equals(om.getReturnType()) &&
Arrays.equals(m.getParameterTypes(),
om.getParameterTypes()));
}
Cela ne vous aide pas à revenir au code source et à ajouter les annotations, mais cela vous donnera une liste à partir de laquelle travailler.
6
Author: Matt McHenry, 2016-01-13 21:48:40