private void populatePluginDescriptionMaps() {

		Predicate<Class<? extends Plugin>> classFilter = createFilter();
		List<Class<? extends Plugin>> classes = ClassSearcher.getClasses(Plugin.class, classFilter);

		for (Class<? extends Plugin> pluginClass : classes) {
			if (!isValidPluginClass(pluginClass)) {
				Msg.warn(this, "Plugin does not have valid constructor! Skipping " + pluginClass);
				continue;
			}

			PluginDescription pd = PluginDescription.getPluginDescription(pluginClass);
			descriptionsByName.put(pluginClass.getName(), pd);

			PluginPackage pluginPackage = pd.getPluginPackage();
			List<PluginDescription> list =
				descriptionsByPackage.computeIfAbsent(pluginPackage, (k) -> new ArrayList<>());
			list.add(pd);
		}

	}
This class maintains a collection of all plugin classes that are acceptable for a given tool
type.  Simple applications with only one plugin type can use the
{@link DefaultPluginsConfiguration}.  More complex tools can support a subset of the available
plugins. Those tools should create custom subclasses for each tool type, that filter out plugins
that are not appropriate for that tool type.
Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginsConfiguration.java