private void processTableSwitch(Program program, BinaryReader bReader, Instruction instruction,
			TaskMonitor monitor) {
		Register alignmentPad = program.getRegister("alignmentPad");
		int alignment = instruction.getValue(alignmentPad, false).intValue();
		if (instruction.getOperandReferences(0).length == 0) {
			Msg.info(this,
				"Skipping tableswitch instruction at " + instruction.getAddress().toString() +
					" - missing operand reference for default case.");
			return;  //user manually deleted reference
		}

		// WARNING: this is very dependent on the sub-constructor for the switch stmt.
		//if the op-object order changes for the operand, this will fail
		Object[] opObjects = instruction.getOpObjects(0);
		Address defaultAddress = instruction.getOperandReferences(0)[0].getToAddress();
		long low = ((Scalar) opObjects[1]).getUnsignedValue();
		long high = ((Scalar) opObjects[2]).getUnsignedValue();

		List<Address> addressesToDisassemble = new ArrayList<>();

		//handle the default case
		addressesToDisassemble.add(defaultAddress);
		addLabelAndReference(program, instruction, defaultAddress, DEFAULT_CASE_LABEL);

		long base = instruction.getMemory().getMinAddress().getOffset();
		long index = instruction.getMinAddress().getOffset();
		index -= base;
		index += (1 + alignment + 4 + 4 + 4); //tableswitch opcode + alignment + size of default + size of low + size of high
		bReader.setPointerIndex(index);

		for (int i = 0; i <= high - low; i++) {
			try {
				int offset = bReader.readNextInt();
				Address toDis = instruction.getMinAddress().add(offset);
				addressesToDisassemble.add(toDis);
				String label = "case_" + (low + i) + "_(0x" + Long.toHexString(low + i) + ")";
				addLabelAndReference(program, instruction, toDis, label);
			}
			catch (IOException e) {
				Msg.error(this, e.getMessage());
			}
		}
		disassembleCases(program, addressesToDisassemble);
		fixupFunction(program, instruction, addressesToDisassemble, monitor);

	}
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