code: public static String getAsString(Type type) {
  		String result = null;
  		if(isSimple(type)) {
  			result = ((Class<?>)type).getCanonicalName();						
  		} else if(isGeneric(type)) {
  			StringBuilder buffer = new StringBuilder();
  			
  			// grab the name of the container class (e.g. List, Map...)
  			ParameterizedType container = (ParameterizedType)type ;
  			String containerType = ((Class<?>)container.getRawType()).getCanonicalName();
  			buffer.append(containerType).append("<");
  
  			// now grab the names of all generic types (those within <...>)
  			Type[] generics = container.getActualTypeArguments();
  			boolean first = true;
  			for(Type generic : generics) {
  				String genericType = getAsString(generic);
  				buffer.append(first ? "" : ", ").append(genericType);
  				first = false;
  			}
  			buffer.append(">");
  			result = buffer.toString();
  		}
  		return result;		
  	}
docs: Returns the string representation of a type; all class names are fully
  qualified, and generics are properly resolved, including their parameter
  types (e.g. Map&lt;String, String&gt;).
  
  @param type
  the type to describe.
  @return
  a textual description of the type (e.g. Map&lt;String, String&gt;).