Thanks for the tip. Looking through StaticTypeCheckingSupport.EXTENSION_METHOD_CACHE.getExtensionMethods(ClassLoader) I was able to see that ExtensionModuleScanner is what I was looking for. Here is my end result for discovering the configured DGM classes:
public static class XYGroovyClassLoader extends GroovyClassLoader { public XYGroovyClassLoader(ClassLoader parent, CompilerConfiguration config) { super(parent, config); } ... private volatile Set<Class> defaultCategories; private volatile Set<Class> defaultStaticCategories; public Set<Class> getDefaultCategories() { if (defaultCategories == null) { synchronized (this) { if (defaultCategories == null) { defaultCategories = new LinkedHashSet<>(); defaultStaticCategories = new LinkedHashSet<>(); try { Class dgm = loadClass("org.codehaus.groovy.runtime.DefaultGroovyMethods"); Class dgsm = loadClass("org.codehaus.groovy.runtime.DefaultGroovyStaticMethods"); Collections.addAll(defaultCategories, (Class[]) dgm.getField("DGM_LIKE_CLASSES").get(dgm)); defaultStaticCategories.add(dgsm); new ExtensionModuleScanner(module -> { if (module instanceof SimpleExtensionModule) { defaultCategories.addAll(((SimpleExtensionModule) module).getInstanceMethodsExtensionClasses()); defaultStaticCategories.addAll(((SimpleExtensionModule) module).getStaticMethodsExtensionClasses()); } }, this).scanClasspathModules(); defaultCategories.addAll(defaultStaticCategories); } catch (Exception e) { Util.log(e, "Failed to find Default Groovy Methods with " + this); } } } } return Collections.unmodifiableSet(defaultCategories); } public boolean isDefaultStaticCategory(String name) { if (defaultStaticCategories == null) getDefaultCategories(); return defaultStaticCategories.stream().map(Class::getName).anyMatch(name::equals); } }