以下是我的代码。正如您将看到的,有两个几乎完全相同的代码块。唯一不同的是对象的类型。我正在寻找一种方法,使其更通用。要有一个代码块,只需在我的方法中将类型(Owner,Car)设置为param。任何提示?我尝试过使用反射,但我从来没能使它变得动态,因为我不得不循环收集
if(queryResult.get(0) instanceof Owner) {
classFields = Owner.class.getDeclaredFields();
data = new Object[queryResult.size()][classFields.length];
for(Owner owner : (List<Owner>)(Object)queryResult) {
int rCounter = 0;
for(Field field : owner.getClass().getDeclaredFields()) {
field.setAccessible(true);
try {
data[lCounter][rCounter] = field.get(owner);
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
}
rCounter++;
}
lCounter++;
}
} else if(queryResult.get(0) instanceof Car) {
classFields = Car.class.getDeclaredFields();
data = new Object[queryResult.size()][classFields.length];
for(Car car : (List<Car>)(Object)queryResult) {
int rCounter = 0;
for(Field field : car.getClass().getDeclaredFields()) {
field.setAccessible(true);
try {
data[lCounter][rCounter] = field.get(car);
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
}
rCounter++;
}
lCounter++;
}
}
答案 0 :(得分:2)
您应该能够将整个代码块折叠为:
Class clazz = queryResult.get(0).getClass();
classFields = clazz.getDeclaredFields();
data = new Object[queryResult.size()][classFields.length];
for(Object result : queryResult) {
int rCounter = 0;
for(Field field : clazzFields) {
field.setAccessible(true);
try {
data[lCounter][rCounter] = field.get(result);
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
}
rCounter++;
}
lCounter++;
}
警告:我没有编译并运行它来检查
答案 1 :(得分:1)
您不需要重复此代码。只需使用car
和owner
作为Object
的实例。您不能使用Car
和Owner
类型
以任何不同/有意义的方式。所以你的代码将继续正常工作
因为两种情况都以相同的方式处理。似乎是唯一的事情
你需要改变的是:
Car.class.getDeclaredFields();
和
Owner.class.getDeclaredFields();
到此:
queryResult.get(0).getClass().getDeclaredFields();