public static void search(TaskMonitor monitor) throws CancelledException {

		if (hasSearched) {
			log.trace("Already searched for classes: using cached results");
			return;
		}

		log.trace("Using restricted extension class loader? " + IS_USING_RESTRICTED_EXTENSIONS);

		Instant start = Instant.now();
		isSearching = true;

		if (Application.inSingleJarMode()) {
			log.trace("Single Jar Mode: using extensions from the jar file");
			extensionPointSuffixToInfoMap = loadExtensionClassesFromJar();
		}
		else {
			extensionPointSuffixToInfoMap = findClasses(monitor);
		}

		log.trace("Found extension classes {}", extensionPointSuffixToInfoMap);
		if (extensionPointSuffixToInfoMap.isEmpty()) {
			throw new AssertException("Unable to locate extension points!");
		}

		hasSearched = true;
		isSearching = false;

		Swing.runNow(() -> fireClassListChanged());

		String finishedMessage =
			"Class search complete (" + ChronoUnit.MILLIS.between(start, Instant.now()) + " ms)";
		monitor.setMessage(finishedMessage);
		log.info(finishedMessage);
	}
Searches the classpath and updates the list of available classes which satisfies the 
internal class filter. When the search completes (and was not cancelled), any registered 
change listeners are notified.

@param monitor the progress monitor for the search
@throws CancelledException if the operation was cancelled
Ghidra/Framework/Generic/src/main/java/ghidra/util/classfinder/ClassSearcher.java