Я просто скажу вам жуткий метод копирования объекта, вы не должны использовать его в производственном коде, но я думаю, что это будет работа. Вы можете использовать Unsafe, backdoor. Все, что вам нужно сделать, это получить небезопасный экземпляр:
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
Ignore вашего IDE, он предупредит вас об ограничении доступа, но если запустить этот код все будет работать. Если ошибка раздражает, игнорируйте ошибки в настройках. После этого вы можете сделать копию объекта на низкоуровневом копировании памяти.
private static long normalize(int value) {
if(value >= 0) return value;
return (~0L >>> 32) & value;
}
public static long sizeOf(Object object){
return getUnsafe().getAddress(
normalize(getUnsafe().getInt(object, 4L)) + 12L);
}
private static long toAddress(Object obj) {
Object[] array = new Object[] {obj};
long baseOffset = getUnsafe().arrayBaseOffset(Object[].class);
return normalize(getUnsafe().getInt(array, baseOffset));
}
private static Object fromAddress(long address) {
Object[] array = new Object[] {null};
long baseOffset = getUnsafe().arrayBaseOffset(Object[].class);
getUnsafe().putLong(array, baseOffset, address);
return array[0];
}
static Object shallowCopy(Object obj) {
long size = sizeOf(obj);
long start = toAddress(obj);
long address = getUnsafe().allocateMemory(size);
getUnsafe().copyMemory(start, address, size);
return fromAddress(address);
}
В конце концов, вы можете просто позвонить в ваш цикл этой конструкции:
Student student = createSampleStudent();
List<Student> studentList= new ArrayList<Student>();
for(int i = 0; i < 5; i++) {
student = MyUnsafeUtil.shallowCopy(student);
student.setId(getRandomId());
studentList.add(student);
}
Помните, что это очень плохо, и темной магии в Java.
Клонировать является опасным методом, используйте с осторожностью. В любом случае, я не верю, что это будет быстрее, чем создание новых студентов в цикле (это правильная вещь) –
p.s. почему в имени богов это занимает много времени, чтобы создать студента ?! Что происходит внутри студента? –
@RichardTingle запущены некоторые методы webservice. Речь идет не о моем коде, а занимает около 30 секунд. Поэтому я не хочу каждый раз создавать Студент. – hellzone