zmacomber commented on a change in pull request #358: ClassUtils.getBaseClasses(desiredBase, packageName) URL: https://github.com/apache/commons-lang/pull/358#discussion_r244380194
########## File path: src/main/java/org/apache/commons/lang3/ClassUtils.java ########## @@ -1059,6 +1067,62 @@ public static boolean isInnerClass(final Class<?> cls) { return getClass(loader, className, initialize); } + /** + * Returns a list of base classes/interfaces underneath the supplied package + * This method only retrieves base classes/interfaces that have children that can be instantiated + * via a no-args constructor + * The class loader is retrieved via Thread.currentThread().getContextClassLoader() + * This only retrieves base classes/interfaces directly underneath the supplied package + * + * @param desiredBase the desired base class/interface to retrieve + * @param packageName the package name in the standard import format (i.e. "java.lang.String") + * @param <T> The desired base class or interface type to retrieve + * @return a list of base classes/interfaces that match the supplied type underneath the supplied package + * @throws IllegalArgumentException if the desiredBase or packageName are invalid + * @throws IOException if an I/O error occurs in getting a new directory stream + * @throws NullPointerException if desiredBase or url are null + * @throws URISyntaxException if the generated url can't be converted to a URI + */ + public static <T> List<T> getBaseClasses(final Class<T> desiredBase, final String packageName) + throws IllegalArgumentException, IOException, NullPointerException, URISyntaxException { + + Objects.requireNonNull(desiredBase, "desiredBase must not be null"); + + if (StringUtils.isBlank(packageName)) { + throw new IllegalArgumentException("packageName must not be blank"); + } + + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + URL url = classLoader.getResource(packageName.replaceAll("[.]", "/")); + Objects.requireNonNull(url, "supplied package not found"); + + Path classesPath = Paths.get(url.toURI()); + + List<T> classes = new ArrayList<>(); + + try (DirectoryStream<Path> stream = Files.newDirectoryStream(classesPath)) { + for (Path file: stream) { + Path pathFileName = file.getFileName(); + if (( ! Files.isDirectory(file)) && (pathFileName != null)) { + String fullClassName = packageName + "." + + pathFileName.toString().replace(".class", ""); + + // Only add classes that can be instantiated via newInstance() + try { + Object obj = Class.forName(fullClassName).newInstance(); Review comment: @ecki How is it complicated to use? The unit tests I wrote show it's simple to use. ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services