docs: private synchronized Class<?> getClass(String className) throws Exception {
          // see if we need to invalidate the class
          ClassInformation classInfo = classInformation.get(className);
          File classFile = new File(classInfo.pluginPath);
          if (classFile.lastModified() > classInfo.lastModified) {
              logger.info("Class {} has been modified, reloading", className);
              logger.info("Thread ID: {}", Thread.currentThread().getId());
              classInfo.loaded = false;
              classInformation.put(className, classInfo);
  
              // also cleanup anything in methodInformation with this className so it gets reloaded
              Iterator<Map.Entry<String, com.groupon.odo.proxylib.models.Method>> iter = methodInformation.entrySet().iterator();
              while (iter.hasNext()) {
                  Map.Entry<String, com.groupon.odo.proxylib.models.Method> entry = iter.next();
                  if (entry.getKey().startsWith(className)) {
                      iter.remove();
                  }
              }
          }
  
          if (!classInfo.loaded) {
              loadClass(className);
          }
  
          return classInfo.loadedClass;
      }