private Program getGzfProgram(File dir, String gzfProgName) throws IOException {
		if (!gzfProgName.endsWith(GZF_FILE_EXT)) {
			throw new IllegalArgumentException();
		}
		String progName = gzfProgName.substring(0, gzfProgName.length() - GZF_FILE_EXT.length());
		try {
			ProgramDB program = env.getProgram(progName); // ignores .gzf extension
			if (program != null) {
				Msg.info(ProcessorEmulatorTestAdapter.class,
					"Loaded program from TestEnv cache: " + progName);
				program.addConsumer(this);
				env.release(program);
				return program;
			}
			if (dir != null) {
				Msg.info(ProcessorEmulatorTestAdapter.class, "Import program: " + gzfProgName);
				program =
					(ProgramDB) env.getGhidraProject().importProgram(new File(dir, gzfProgName));
				program.addConsumer(this);
				env.getGhidraProject().close(program);
				env.saveToCache(progName, program, true, TaskMonitor.DUMMY); // ignores .gzf extension
				return program;
			}
		}
		catch (Exception e) {
			throw new IOException(e);
		}
		throw new FileNotFoundException("Program file not found: " + gzfProgName);
	}
Get the loader class which should be used.  A null value should be
return to use the preferred loader.
@return loader class or null
Ghidra/Features/Base/src/main/java/ghidra/test/processors/support/ProcessorEmulatorTestAdapter.java