问题描述
我有两个对象-输出(具有20个字段或属性)和一个对象o,其中某些字段(从1到5)。
我想比较对象o的所有这5个字段的值 在输出对象中包含它们的值。
说输出对象的属性为a到z。对象o具有a到c的属性,因此我想将output.a,output.b和output.c的值与o.a,o.b和o.c
进行比较请注意,我不知道o.a,o.b和o.c是否存在,但我正在从字段中动态检索它们的属性:
下面是代码。我已经在行中标记了什么在工作,什么不在工作。我不知道如何键入强制转换,因为我不知道属性名称。
private void CompareObjects(Output output,Object o) throws IllegalAccessException,NoSuchFieldException {
Class<?> r = o.getClass();
Field[] fields = respclass.getDeclaredFields();
for (Field field : fields) {
String fname = field.getType().getSimpleName();
print((field.getName())output.getClass().getDeclaredField(fname));// NOT Working error line,not able to typecast it with the field.getName()
// print(field.getType())output.getClass().getDeclaredField(fname)); // NOT Working
}
解决方法
field.getName()
将返回带有字段名称的字符串文字,因此很明显您无法对其进行强制转换
无论如何,我建议将两个对象都转换为HashMap
s
<fieldName,fieldValue>
,然后检查output
地图是否包含o
地图
您可以轻松地执行此操作,例如使用此处描述的Jackson Mapper:Java introspection: object to map
,我认为您应该使用两个循环来解决问题。
package com.test.dal;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
public class LTest {
public static class Output {
public String a;
public int b;
public boolean c;
public Output(String a,int b,boolean c) {
this.a = a;
this.b = b;
this.c = c;
}
}
public static class Input {
public int b;
public boolean c;
public Input(int b,boolean c) {
this.b = b;
this.c = c;
}
}
public static void main(String[] args) throws Exception {
Output output = new Output("a",1,false);
Input input = new Input(1,false);
CompareObjects(output,input);
}
private static void CompareObjects(Output output,Input o) throws IllegalAccessException,NoSuchFieldException {
Field[] oFilds = o.getClass().getDeclaredFields();
Field[] outputFilds = output.getClass().getDeclaredFields();
for (Field ofield : oFilds) {
String oFiledName = ofield.getName();
String oFiledType = ofield.getType().getTypeName();
for (Field outputField : outputFilds) {
String outputFiledName = outputField.getName();
String outputFiledType = outputField.getType().getTypeName();
if (oFiledName.equals(outputFiledName) && oFiledType.equals(outputFiledType)) {
Object oFildObj = ofield.get(o);
Object outputFildObj = outputField.get(output);
if (oFiledType.equals("int")) {
int oFildInt = (int) oFildObj;
int outputFildInt = (int) outputFildObj;
} else if (oFiledType.equals("boolean")) {
boolean oFildInt = (boolean) oFildObj;
boolean outputFildInt = (boolean) outputFildObj;
}
}
}
}
}
}