繁体   English   中英

如何将Java对象的克隆添加到列表

[英]How to add clone of a java object to list

我有一个arraylist,我想在此arraylist中添加一些更改很少的对象。

这是我的代码;

Student student = createSampleStudent();
List<Student> studentList= new ArrayList<Student>();

for(int i = 0; i < 5; i++) {
    student.setId(getRandomId());
    studentList.add(student);
}

我想将学生添加到具有不同id的studentList中。我无法在for循环中创建学生,因为创建学生所需的时间太长。 我发现有一个克隆方法,但是Student对象有很多字段(其中大多数都指向另一个对象)。 有什么主意吗

我只是告诉您一个复制对象的令人毛骨悚然的方法,您一定不能在生产代码中使用它,但是我认为这是可行的。 您可以使用Sun的后门Unsafe。 您需要做的就是获取Unsafe实例:

Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);

忽略您的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);
}

毕竟,您只需在for循环中调用此构造即可:

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中是一个非常糟糕的黑暗魔术。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM