code: public static Set<Annotation> readSingleConstantAnnotations(Class<?> udfClass) {
  		ConstantFields constantSet = udfClass.getAnnotation(ConstantFields.class);
  		ConstantFieldsExcept notConstantSet = udfClass.getAnnotation(ConstantFieldsExcept.class);
  		ReadFields readfieldSet = udfClass.getAnnotation(ReadFields.class);
  
  		Set<Annotation> result = null;
  
  		if (notConstantSet != null && constantSet != null) {
  			throw new InvalidProgramException("Either " + ConstantFields.class.getSimpleName() + " or " + 
  					ConstantFieldsExcept.class.getSimpleName() + " can be annotated to a function, not both.");
  		}
  
  		if (notConstantSet != null) {
  			result = new HashSet<Annotation>();
  			result.add(notConstantSet);
  		}
  		if (constantSet != null) {
  			result = new HashSet<Annotation>();
  			result.add(constantSet);
  		}
  
  		if (readfieldSet != null) {
  			if (result == null) {
  				result = new HashSet<Annotation>();
  			}
  			result.add(readfieldSet);
  		}
  
  		return result;
  	}
docs: Reads the annotations of a user defined function with one input and returns semantic properties according to the constant fields annotated.
  
  @param udfClass The user defined function, represented by its class.
  @return	The DualInputSemanticProperties containing the constant fields.