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:
[email protected]
With regards,
Apache Git Services