Shervin Asgari Shervin Asgari - 4 months ago 14
Java Question

Copy all values from fields in one class to another through reflection

I have a class which is basically a copy of another class.

public class A {
int a;
String b;
}

public class CopyA {
int a;
String b;
}


What I am doing is putting values from class
A
into
CopyA
before sending
CopyA
through a webservice call. Now I would like to create a reflection-method that basically copies all fields that are identical (by name and type) from class
A
to class
CopyA
.

How can I do this?

This is what I have so far, but it doesn't quite work. I think the problem here is that I am trying to set a field on the field I am looping through.

private <T extends Object, Y extends Object> void copyFields(T from, Y too) {

Class<? extends Object> fromClass = from.getClass();
Field[] fromFields = fromClass.getDeclaredFields();

Class<? extends Object> tooClass = too.getClass();
Field[] tooFields = tooClass.getDeclaredFields();

if (fromFields != null && tooFields != null) {
for (Field tooF : tooFields) {
logger.debug("toofield name #0 and type #1", tooF.getName(), tooF.getType().toString());
try {
// Check if that fields exists in the other method
Field fromF = fromClass.getDeclaredField(tooF.getName());
if (fromF.getType().equals(tooF.getType())) {
tooF.set(tooF, fromF);
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}


I am sure there must be someone that has already done this somehow

Answer

If you don't mind using a third party library, BeanUtils from Apache Commons will handle this quite easily, using copyProperties(Object, Object).