private void processInstructions(Program program, Data constantPoolData,
			ClassFileJava classFile, TaskMonitor monitor) throws CancelledException {

		InstructionIterator instructionIt =
			program.getListing().getInstructions(toAddr(program, JavaLoader.CODE_OFFSET), true);
		AbstractConstantPoolInfoJava[] constantPool = classFile.getConstantPool();
		Map<Integer, Integer> indexMap = getIndexMap(constantPool);
		BootstrapMethods[] bootstrapMethods =
			getBootStrapMethodAttribute(classFile, constantPool, indexMap);

		for (Instruction instruction : instructionIt) {
			monitor.checkCancelled();

			if (!hasConstantPoolReference(instruction.getMnemonicString())) {
				continue;
			}

			if (instruction.getMnemonicString().equals("invokedynamic")) {
				addInvokeDynamicComments(program, constantPool, indexMap, bootstrapMethods,
					instruction);
			}

			int index = (int) (instruction.getScalar(0).getValue() & 0xFFFFFFFF);

			Data referredData = constantPoolData.getComponent(indexMap.get(index));
			instruction.addOperandReference(0, referredData.getAddress(), RefType.DATA,
				SourceType.ANALYSIS);
			CompoundCmd<Program> cmd = new CompoundCmd<>("Add constant pool reference");
			String constantPoolLabel = "CPOOL[" + index + "]";
			cmd.add(
				new AddLabelCmd(referredData.getAddress(), constantPoolLabel, SourceType.ANALYSIS));

			Reference ref = instruction.getOperandReferences(0)[0];
			cmd.add(new AssociateSymbolCmd(ref, constantPoolLabel));
			cmd.applyTo(program);
		}
	}
Create datatypes for all classes mentioned in the constant pool
@param program program file
@param classFile ClassFileJava associated with {@code program} 
@param monitor for canceling analysis
@param messageLog for logging messages
Ghidra/Processors/JVM/src/main/java/ghidra/javaclass/analyzers/JavaAnalyzer.java