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
This is a late post, but can still be effective for people in future.
Spring provides a utility
BeanUtils.copyProperties(srcObj, tarObj)
which copies values from source object to target object when the names of the member variables of both classes are the same.If there is a date conversion, (eg, String to Date) 'null' would be copied to the target object. We can then, explicitly set the values of the date as required.
The BeanUtils from
Apache Common
throws an error when there is a mismatch of data-types (esp. conversion to and from Date)Hope this helps!
Orika's is simple faster bean mapping framework because it does through byte code generation. It does nested mappings and mappings with different names. For more details, please check here Sample mapping may look complex, but for complex scenarios it would be simple.
Why don't you use gson library https://github.com/google/gson
you just convert the Class A to json string. Then convert jsonString to you subClass (CopyA) .using below code:
Without using BeanUtils or Apache Commons
If you have spring in the dependencies you can also use org.springframework.beans.BeanUtils.
https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/BeanUtils.html
If you don't mind using a third party library, BeanUtils from Apache Commons will handle this quite easily, using
copyProperties(Object, Object)
.