I need to back up a test Object's fields using Reflection.
If fieldObject is Cloneable I need to clone() it, but I can't figure out how to call clone() when it's protected in Object class.
For example, ClassroomStoryTest is a test object in runtime:
public class ClassroomStoryTest {
    private java.util.Date reconstructionTime;   // Cloneable
    private String nameOfClassroom;              // Got copy-ctor
    private Chairs chairs;                       // Not Cloneable and No copy-ctor
...
}
// test instanceof ClassroomStoryTest
var fields = test.getClass().getDeclaredFields();
var backupFields = Arrays.stream(fields).map(field -> {
            // field.setAccessible(true) + field.get(test);
            var fieldObject = accessibleGet(field, test); 
            // getDeclaredConstructor(currObj.getClass())
            var copyCtor = getConstructor(fieldObject); 
            if (fieldObject instanceof Cloneable) {
                // 'clone' has protected access in 'java.lang.Object'
                return fieldObject.clone(); // <-- Error
            } else if (copyCtor != null) {
                // copyCtor.newInstance(fieldObject)
                return createInstance(copyCtor, fieldObject);
            }
            return fieldObject;
        }).toArray();
The only solution I thought about is making clone() public in runtime, is there any other solution? I wonder if I can do something like ((CloneableObject) fieldObject).clone()?
 
Aucun commentaire:
Enregistrer un commentaire