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).

Author: smithkm, 2016-01-09

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