docs: public Object execStaticMethod( String className, String methodName, List params, List<String> paramTypes ) throws ClassLoaderException {
          Class<?> clazz;
          try {
              clazz = loadClass( className );
          } catch (ClassNotFoundException e) {
              throw new ClassLoaderException( e );
          }
          
          List<Class> types = null;
          
          if ( params != null ) {
              types = new ArrayList<Class>();
              if (paramTypes == null) {
                  for ( Object param: params ) {
                      types.add( param.getClass() );
                  }
              } else {
                  for ( String type : paramTypes ) {
                      try {
                          types.add( loadClass( type ) );
                      } catch (ClassNotFoundException e) {
                          throw new ClassLoaderException( e );
                      }
                  }
              }
          }
          
          if ( params != null ) {
              Method method;
              try {
                  method = clazz.getDeclaredMethod(methodName, types.toArray(new Class[types.size()]));
              } catch (SecurityException e) {
                  throw new ClassLoaderException( e );
              } catch (NoSuchMethodException e) {
                  throw new ClassLoaderException( e );
              }
              
              try {
                  return method.invoke( clazz, params.toArray( new Object[params.size()] ) );
              } catch (IllegalArgumentException e) {
                  throw new ClassLoaderException( e );
              } catch (IllegalAccessException e) {
                  throw new ClassLoaderException( e );
              } catch (InvocationTargetException e) {
                  throw new ClassLoaderException( e );
              }
          } else {
              
              Method method;
              try {
                  method = clazz.getDeclaredMethod(methodName);
              } catch (SecurityException e) {
                  throw new ClassLoaderException( e );
              } catch (NoSuchMethodException e) {
                  throw new ClassLoaderException( e );
              }
              
              try {
                  return method.invoke( clazz );
              } catch (IllegalArgumentException e) {
                  throw new ClassLoaderException( e );
              } catch (IllegalAccessException e) {
                  throw new ClassLoaderException( e );
              } catch (InvocationTargetException e) {
                  throw new ClassLoaderException( e );
              }
          }
      }