@Override
	public boolean analyze(Program program, AddressSetView set, TaskMonitor monitor, MessageLog log)
			throws Exception {
		monitor.setMaximum(set.getNumAddresses());
		monitor.setProgress(0);

		ByteProvider provider = MemoryByteProvider.createProgramHeaderByteProvider(program, false);
		BinaryReader reader = new BinaryReader(provider, false);

		Listing listing = program.getListing();
		InstructionIterator instructionIterator = listing.getInstructions(set, true);

		//find the switch instructions and process them
		while (instructionIterator.hasNext()) {
			Instruction instruction = instructionIterator.next();
			monitor.checkCancelled();
			monitor.incrementProgress(instruction.getLength());
			String mnenomic = instruction.getMnemonicString();
			if (!mnenomic.equals(TABLESWITCH_MNEMONIC) && !mnenomic.equals(LOOKUPSWITCH_MNEMONIC)) {
				continue; //only care about switch instructions
			}
			monitor.setMessage("JvmSwitchAnalyzer: " + instruction.getMinAddress());
			if (instruction.getMnemonicString().equals(TABLESWITCH_MNEMONIC)) {
				processTableSwitch(program, reader, instruction, monitor);
			}
			else {
				processLookupSwitch(program, reader, instruction, monitor);
			}
		}
		return true;
	}
This analyzer reads through JVM .class files looking for lookupswitch and tableswitch instructions.
 For each such instruction, the analyzer determines all the possible jump targets, disassembles them,
 and then newly-disassembled code to the appropriate function body.
Ghidra/Processors/JVM/src/main/java/ghidra/javaclass/analyzers/JvmSwitchAnalyzer.java