private String[] getIndexes(final Object data) throws DataClassException {
        Map<Index, String> indexValuePair = new EnumMap<Index, String>(Index.class);
        Field[] fields = data.getClass().getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
            if (field.isAnnotationPresent(Searchable.class)) {
                field.setAccessible(true);
                Searchable searchable = field.getAnnotation(Searchable.class);
                try {
                    Object previous = indexValuePair.put(searchable.value(), (String) field.get(data));
                    if (previous != null) {
                        throw new DataClassException("Duplicated Declaration of Index " + searchable.value()
                                + " on field " + field.getName());
                    }
                } catch (IllegalArgumentException ex) {
                    throw new DataClassException("Field " + field.getName() + " is not String!");
                } catch (IllegalAccessException ex) {
                    throw new DataClassException("Set field " + field.getName() + " accessible failed!");
                }
            }
        }

        String[] indexes = new String[indexValuePair.size()];

        for (int i = 0; i < indexValuePair.size(); i++) {
            String value = indexValuePair.get(Index.values()[i]);
            if (value == null) {
                throw new DataClassException("Index " + Index.values()[i] + " declaration is missing.");
            }
            indexes[i] = value;
        }
        return indexes;
    }