code: public static String getDescriptiveType(Object value) {
  		if (value == null) {
  			return null;
  		}
  		Class<?> clazz = value.getClass();
  		if (Proxy.isProxyClass(clazz)) {
  			StringBuilder result = new StringBuilder(clazz.getName());
  			result.append(" implementing ");
  			Class<?>[] ifcs = clazz.getInterfaces();
  			for (int i = 0; i < ifcs.length; i++) {
  				result.append(ifcs[i].getName());
  				if (i < ifcs.length - 1) {
  					result.append(',');
  				}
  			}
  			return result.toString();
  		}
  		else if (clazz.isArray()) {
  			return getQualifiedNameForArray(clazz);
  		}
  		else {
  			return clazz.getName();
  		}
  	}
docs: Return a descriptive name for the given object's type: usually simply
  the class name, but component type class name + "[]" for arrays,
  and an appended list of implemented interfaces for JDK proxies.
  @param value the value to introspect
  @return the qualified name of the class