Дизайн, совместимый с отражением - PullRequest
0 голосов
/ 11 декабря 2019

У меня есть некоторый код, который полагается на рефлексию (работая со сторонней библиотекой) для получения полей класса. Многие из этих классов используют комбинацию одних и тех же полей, некоторые из которых почти идентичны, но с некоторыми отличиями.

Это привело к множеству дублирования кода, но я не уверен в хорошем шаблоне вокруг этого из-зак отражению достоверности.

Согласно документации :

Возвращает массив объектов Field, отражающих все поля, объявленные классом или интерфейсом, представленным этимОбъект класса. Это включает в себя открытый, защищенный, доступ по умолчанию (пакет) и частные поля, но исключает унаследованные поля .

Это исключает класс Abstract или любые решения, связанные с наследованием.

Вот пример кода (MyField представляет сторонний объект библиотеки, а myData является открытым членом MyField):

ClassA.java

public class ClassA {
    private final Field[] myFields;

    private final MyField a = new MyField(1);
    private final MyField b = new MyField(2);
    private final MyField c = new MyField(3);

    public ClassA() {
        myFields = this.getClass().getDeclaredFields();
    }

    public void doStuff(Field[] myFields) {
        // As an example, this clears out the field values.
        // There are several of these methods that use or manipulate the fields
        for (Field f : myFields) {
            if (f.getType() == MyField.class
                || f.getType().getSuperclass() == MyField.class) {
                try {
                    f.setAccessible(true);
                    ((MyField) f.get(this)).myData.reset();
                }
                catch (IllegalArgumentException | IllegalAccessException e) {
                    continue;
                }
            }
        }
    }

    public Field[] getFields() {
        return Arrays.copyOf(myFields, myFields.length);
    {
}

ClassB.java

public class ClassB {
    private final Field[] myFields;

    private final MyField a = new MyField(1);
    private final MyField c = new MyField(3);
    private final MyField d = new MyField(4);

    public ClassB() {
        myFields = this.getClass().getDeclaredFields();
    }

    public void doStuff(Field[] myFields) {
        // Same as above
    }

    public Field[] getFields() {
        return Arrays.copyOf(myFields, myFields.length);
    {
}

Обратите внимание, что ClassA и ClassB разделяют поля a и c и методы getFields()и doStuff().

Можно ли как-то усилить это дублирование, не влияя на отражение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...