У меня есть некоторый код, который полагается на рефлексию (работая со сторонней библиотекой) для получения полей класса. Многие из этих классов используют комбинацию одних и тех же полей, некоторые из которых почти идентичны, но с некоторыми отличиями.
Это привело к множеству дублирования кода, но я не уверен в хорошем шаблоне вокруг этого из-зак отражению достоверности.
Согласно документации :
Возвращает массив объектов 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()
.
Можно ли как-то усилить это дублирование, не влияя на отражение?