如何克隆缓存中取出的内容?

专业二三维GIS 2010-03-09 10:41:12
在使用JCS时,从缓存中取出一个对象后,如果修改这个对象的属性值,缓存中的对象的相应属性值也会变化,可见通过JCS的get方法从缓存中取出的只是一个引用,如下:
JCS empcache=JCS.getInstance("empcache");
Employee employee=empcache.get("john");
System.out.print(employee.getDepartment()); //假设此时输出结果为"HR"
employee.setDepartment("Market");
System.out.print(employee.getDepartment()); //输出结果为"market"
System.out.print(empcache.get("john").getDepartment()); //这里的输出结果也变成了"market",但我不希望它改变.


我希望的结果是将缓存对象clone(深度复制)一个副本,当副本改变时缓存对象不会受到任何影响.
我知道可以自己重写Employee的clone()方法来实现对Employee对象的深度复制,但这样做很麻烦,而且不够灵活.不知道JCS里面有没有什么配置或方法使得从缓存中取出的是一个副本? 当然,除JCS之外的其它缓存技术如果能实现这种需求的话也请推荐一下.
...全文
83 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
BearKin 2010-03-09
  • 打赏
  • 举报
回复
代码一共没多少行 写就写了被..
专业二三维GIS 2010-03-09
  • 打赏
  • 举报
回复
晕了,我就是不想写代码才发问的,你的这种方法我也想过.
我只是想知道直接用JCS或其它缓存组件有没有复制内容的功能.

不过非常感谢你,辛苦了!
BearKin 2010-03-09
  • 打赏
  • 举报
回复

import java.lang.reflect.Field;

public class ObjectCopy {

public static void main(String[] args) throws Exception {
A baseObject = new A(new B(new C("bString1", "bString2"), 1, 2), new C(
"cString1", "cString2"));
A copyObject = (A) copyObject(baseObject, "java.lang.Integer",
"java.lang.String");

System.out.println(baseObject);
System.out.println(copyObject);
}

/**
* COPY对象(毛病还是很多的。。)
*
* @author Lv9
* @since 2010.03.09
* @param Object baseObject 将要被COPY的对象
* @param String[] noCopyClassNames 对象内不必深COPY的属性声明(如java.lang.Integer)
*/
public static Object copyObject(Object baseObject,
String... noCopyClassNames) throws Exception {
Object copyObject = baseObject.getClass().newInstance();

Field[] fields = baseObject.getClass().getDeclaredFields();

for (Field field : fields) {
field.setAccessible(true);
if (checkClassType(field.getType().getName(), noCopyClassNames)) {
field.set(copyObject, field.get(baseObject));
} else {
field.set(copyObject, copyObject(field.get(baseObject),
noCopyClassNames));
}
}
return copyObject;
}

public static boolean checkClassType(String className,
String[] noCopyClassNames) {
for (String noCopyClassName : noCopyClassNames) {
if (className.equals(noCopyClassName)) {
return true;
}
}
return false;
}
}

class A {
private B b;
private C c;

public A() {

}

public A(B b, C c) {
this.b = b;
this.c = c;
}

public B getB() {
return b;
}

public void setB(B b) {
this.b = b;
}

public C getC() {
return c;
}

public void setC(C c) {
this.c = c;
}

@Override
public String toString() {
return "[A: b = " + b + ",c = " + c + ",hashCode = " + hashCode() + "]";
}
}

class B {
private C c;
private Integer int1;
private Integer int2;

public B() {

}

public B(C c, Integer int1, Integer int2) {
this.c = c;
this.int1 = int1;
this.int2 = int2;
}

public C getC() {
return c;
}

public void setC(C c) {
this.c = c;
}

public Integer getInt1() {
return int1;
}

public void setInt1(Integer int1) {
this.int1 = int1;
}

public Integer getInt2() {
return int2;
}

public void setInt2(Integer int2) {
this.int2 = int2;
}

@Override
public String toString() {
return "[B: int1 = " + int1 + ",int2 = " + int2 + ",c = " + c
+ ",hashCode = " + hashCode() + "]";
}
}

class C {
private String string1;
private String string2;

public C() {

}

public C(String string1, String string2) {
this.string1 = string1;
this.string2 = string2;
}

public String getString1() {
return string1;
}

public void setString1(String string1) {
this.string1 = string1;
}

public String getString2() {
return string2;
}

public void setString2(String string2) {
this.string2 = string2;
}

@Override
public String toString() {
return "[C: string1 = " + string1 + ",string2 = " + string2
+ ",hashCode = " + hashCode() + "]";
}
}



刚写的 您运行下吧 我查看了结果 思路大概就是这样吧..
BearKin 2010-03-09
  • 打赏
  • 举报
回复
那俺就不知道了 连里面的对象属性都要COPY的话...恩..
专业二三维GIS 2010-03-09
  • 打赏
  • 举报
回复
我早试过了,BeanUtils只能币制一些基本数据类型的值,并不能实现深度复制.
BearKin 2010-03-09
  • 打赏
  • 举报
回复
引用 1 楼 bearkin 的回复:
你要改变该对象的什么属性值? 该对象里面对象的属性值也要改么? 如果不需要改的话 不知道BeanUtils用来复制个Bean是不是更快些呢?


如果说里面的对象也要COPY的话...想想..
BearKin 2010-03-09
  • 打赏
  • 举报
回复
你要改变该对象的什么属性值? 该对象里面对象的属性值也要改么? 如果不需要改的话 不知道BeanUtils用来复制个Bean是不是更快些呢?

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧