code: public IType getByRelativeName(String relativeName, ITypeUsesMap typeUses) throws ClassNotFoundException {
      String relativeName1 = relativeName;
      IType type = FrequentUsedJavaTypeCache.instance( getExecutionEnv() ).getHighUsageType(relativeName1);
      if (type != null) {
        return type;
      }
      //## todo: consider handling requests to find a parameterized type... the following is a giant hack
      int i = relativeName1 == null ? -1 : relativeName1.indexOf( '<' );
      if( i >= 0 )
      {
        assert relativeName1 != null;
        relativeName1 = relativeName1.substring( 0, i );
      }
      //##
      type = getTypeByRelativeNameIfValid_NoGenerics(relativeName1, typeUses);
      if( type == null )
      {
        throw new ClassNotFoundException(relativeName1);
      }
      else
      {
        return type;
      }
    }
docs: Gets an intrinsic type based on a relative name.  This could either be the name of an entity,
  like "User", the name of a typekey, like "SystemPermission", or a class name, like
  "java.lang.String" (relative and fully qualified class names are the same as far as this factory
  is concerned).  Names can have [] appended to them to create arrays, and multi-dimensional arrays
  are supported.
  
  @param relativeName the relative name of the type
  @param typeUses     the map of used types to use when resolving
  @return the corresponding IType
  @throws ClassNotFoundException if the specified name doesn't correspond to any type