private static Map<String, DoFnSignature.FieldAccessDeclaration> analyzeFieldAccessDeclaration( ErrorReporter errors, Class<?> fnClazz) { Map<String, FieldAccessDeclaration> fieldAccessDeclarations = new HashMap<>(); for (Field field : declaredFieldsWithAnnotation(DoFn.FieldAccess.class, fnClazz, DoFn.class)) { field.setAccessible(true); DoFn.FieldAccess fieldAccessAnnotation = field.getAnnotation(DoFn.FieldAccess.class); if (!Modifier.isFinal(field.getModifiers())) { errors.throwIllegalArgument( "Non-final field %s annotated with %s. Field access declarations must be final.", field.toString(), DoFn.FieldAccess.class.getSimpleName()); continue; } Class<?> fieldAccessRawType = field.getType(); if (!fieldAccessRawType.equals(FieldAccessDescriptor.class)) { errors.throwIllegalArgument( "Field %s annotated with %s, but the value was not of type %s", field.toString(), DoFn.FieldAccess.class.getSimpleName(), FieldAccessDescriptor.class.getSimpleName()); } fieldAccessDeclarations.put( fieldAccessAnnotation.value(), FieldAccessDeclaration.create(fieldAccessAnnotation.value(), field)); } return fieldAccessDeclarations; }