0

クラスの修飾子を指定したすべてのフィールドを収集したいと考えています。私は次のコードを書きました:

/**
 * Method getFields
 * @author TapasB
 * @since 03-Nov-2013 - 2:03:17 pm
 * @version DAM 1.0
 * @param instanceClass
 * @return
 */
@SuppressWarnings({ "unchecked", "rawtypes" })
public static List<Field> getFields(Class<?> instanceClass) {
    List<Field> fields = new ArrayList<Field>();        
    Class<?> searchType = instanceClass;

    while (!Object.class.equals(searchType) && searchType != null) {
        fields.addAll(Arrays.asList(searchType.getDeclaredFields()));
        searchType = searchType.getSuperclass();
    }

    return Collections.unmodifiableList(new ArrayList(selectDistinct(fields, "name")));
}

/**
 * Method getFields
 * @author TapasB
 * @since 03-Nov-2013 - 2:31:59 pm
 * @version DAM 1.0
 * @param instanceClass
 * @param includedModifiers
 * @param excludedModifiers
 * @return
 */
public static List<Field> getFields(Class<?> instanceClass, int[] includedModifiers, int[] excludedModifiers) {
    List<Field> fields = getFields(instanceClass);
    List<Field> filteredFields = new ArrayList<Field>();

    if(ArrayUtils.isEmpty(includedModifiers)) {
        filteredFields.addAll(fields);
    } else {
        for(Field field : fields) {
            boolean fieldCanBeAdded = false;

            for(int includedModifier : includedModifiers) {
                if((includedModifier & field.getModifiers()) != 0) {
                    fieldCanBeAdded = true;
                }
            }

            if(fieldCanBeAdded) {
                filteredFields.add(field);
            }
        }
    }               

    if(ArrayUtils.isNotEmpty(excludedModifiers)) {
        Iterator<Field> fieldIterator = filteredFields.iterator();

        while (fieldIterator.hasNext()) {
            Field field = fieldIterator.next();
            boolean fieldNeedsToBeRemoved = false;

            for(int excludedModifier : excludedModifiers) {
                if((excludedModifier & field.getModifiers()) != 0) {
                    fieldNeedsToBeRemoved = true;
                }
            }

            if(fieldNeedsToBeRemoved) {
                fieldIterator.remove();
            }
        }
    }   

    return Collections.unmodifiableList(filteredFields);
}

このメソッドgetFields(Class<?> instanceClass)は、指定されたクラスのすべてのスーパー クラスに対して繰り返しフィールドを検索し、 で停止しObjectます。

ここで [ selectDistinct][2] は [LambdaJ API][3] のメソッドです。親クラスにも子クラスにも存在する同じ名前のフィールドを削除します。

私が望むものを達成するための良い方法であるかどうか疑問に思っていました.

実行するには:

public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    int[] includedModifiers = new int[]{Modifier.PRIVATE};
    int[] excludedModifiers = new int[]{Modifier.FINAL};
    List<Field> fields = getFields(ArrayList.class, includedModifiers, excludedModifiers);

    for(Field field : fields) {
        System.out.println(field.getName());
    }
}

main、修飾子のみを持ちprivate、 を除外するフィールドのみを出力しprivate finalます。

これまでのところ、このコードで見つかった問題はありません。より良い解決策が存在するかどうかを知りたいだけです。

4

0 に答える 0