From 502095002c750d6ac6c94333d1eec6716fec2653 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 23 Jan 2025 09:32:57 -0600 Subject: [PATCH] Add getClassesContainingNameAndOfType --- .../backend/core/utils/ClassPathUtils.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ClassPathUtils.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ClassPathUtils.java index 4b90666f..bcc42f2f 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ClassPathUtils.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/ClassPathUtils.java @@ -61,6 +61,39 @@ public class ClassPathUtils + /******************************************************************************* + ** from https://stackoverflow.com/questions/520328/can-you-find-all-classes-in-a-package-using-reflection + ** + *******************************************************************************/ + public static List> getClassesContainingNameAndOfType(String nameContains, Class type) throws IOException + { + List> classes = new ArrayList<>(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + + for(ClassPath.ClassInfo info : getTopLevelClasses(loader)) + { + try + { + if(info.getName().contains(nameContains)) + { + Class testClass = info.load(); + if(type.isAssignableFrom(testClass)) + { + classes.add(testClass); + } + } + } + catch(Throwable t) + { + // ignore - comes up for non-class entries, like module-info + } + } + + return (classes); + } + + + /******************************************************************************* ** *******************************************************************************/