public static String getTypeNameFromDescriptor(String descriptor, boolean fullyQualifiedName,
			boolean replaceSlash) {
		if (descriptor.startsWith("L")) {
			//leave off the initial L and the final ;
			String name = descriptor.substring(1, descriptor.length() - 1);
			if (fullyQualifiedName) {
				if (replaceSlash) {
					return name.replace("/", ".");
				}
				return name;
			}
			int lastSlash = name.lastIndexOf("/");
			//lastSlash+1 so the slash is not included in the name
			return name.substring(lastSlash + 1, name.length());
		}
		if (descriptor.startsWith("[")) {
			int dimension = descriptor.lastIndexOf("[") + 1;
			String baseType = getTypeNameFromDescriptor(descriptor.replace("[", ""),
				fullyQualifiedName, replaceSlash);
			StringBuilder sb = new StringBuilder(baseType);
			for (int i = 0; i < dimension; ++i) {
				sb.append("[]");
			}
			return sb.toString();
		}
		switch (descriptor.charAt(0)) {
			case BASE_TYPE_BYTE:  //signed byte
				return "byte";
			case BASE_TYPE_CHAR:  //char
				return "char";
			case BASE_TYPE_FLOAT:  //float
				return "float";
			case BASE_TYPE_INT:  //int
				return "int";
			case BASE_TYPE_SHORT:  //signed short
				return "short";
			case BASE_TYPE_BOOLEAN:  //boolean
				return "boolean";
			case BASE_TYPE_DOUBLE:  //double
				return "double";
			case BASE_TYPE_LONG:  //long
				return "long";
			case BASE_TYPE_VOID:  //void (only for return types)
				return "void";
			default:
				throw new IllegalArgumentException("invalid descriptor: " + descriptor);
		}
	}
Returns the type name for a parameter descriptor
@param descriptor
@return
Ghidra/Processors/JVM/src/main/java/ghidra/javaclass/format/DescriptorDecoder.java