【发布时间】:2019-12-12 03:05:00
【问题描述】:
我有一些代码依赖于反射(使用第三方库)来获取类的字段。其中许多类混合使用相同的字段,有些几乎相同,但有一些不同。
这导致了大量的代码重复,但由于依赖反射,我不确定是否有一个好的模式。
返回一个 Field 对象数组,反映由该 Class 对象表示的类或接口声明的所有字段。这包括公共、受保护、默认(包)访问和私有字段,但不包括继承的字段。
这排除了抽象类或任何与继承相关的解决方案。
这是一个代码示例(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()。
有什么方法可以在不影响反射的情况下支持这种重复?
【问题讨论】:
-
那些是你的课?他们为什么首先将这些声明为字段?他们可能应该在
Map中,并为您节省整个反射的事情。您可能应该添加doStuff对这些字段所做的一些事情以澄清问题。 -
更新了
doStuff()中的示例代码
标签: java reflection