我只知道动态代理用于AOP。
然而,我不能理解这与普通的存取器有什么不同,在这里“懒惰”加载到底是什么?
如果能帮助我们理解作者所说的延迟加载是什么意思,我们将非常感谢。
private Category tupleToObject(Serializable[] tuple) {
Category category = new Category((String)tuple[1],
(YearMonthDay) tuple[2]);
category.setId((Long) tuple[0]);
category.setParent(lazyGet((Long) tuple[3]));
return category;
}
protected CategoryItf lazyGet(Long id) {
if (id == null) {
return null;
}
return (CategoryItf)Proxy.newProxyInstance(
CategoryItf.class.getClassLoader(),
new Class[] { CategoryItf.class },
new LazyLoadedObject() {
protected Object loadObject() {
return get(id);
}
});
}
public abstract class LazyLoadedObject implements InvocationHandler {
private Object target;
public Object invoke(Object proxy,
Method method, Object[] args)
throws Throwable {
if (target == null) {
target = loadObject();
}
return method.invoke(target, args);
}
protected abstract Object loadObject();
}
这和下面的有什么不同:
private Category tupleToObject(Serializable[] tuple) {
Category category = new Category((String)tuple[1],
(YearMonthDay) tuple[2]);
category.setId((Long) tuple[0]);
category.setParent(get((Long) tuple[3]));
return category;
}
发布于 2013-06-21 05:20:14
下面的代码片段使得实现变得“懒惰”:
private Object target;
public Object invoke(Object proxy,
Method method, Object[] args)
throws Throwable {
if (target == null) {
target = loadObject();
}
您可以看到,无论您调用此代码多少次,每次都会得到相同的对象。所以,实际上它是单例的。然而,它不是在程序开始时创建的,而是在第一次需要它时创建的。这就是“懒惰”的意思。
发布于 2013-06-21 07:05:23
让我试着解释一下我是如何理解代码的:
在此代码中:
private Category tupleToObject(Serializable[] tuple) {
Category category = new Category((String)tuple[1],
(YearMonthDay) tuple[2]);
category.setId((Long) tuple[0]);
category.setParent(get((Long) tuple[3]));
return category;
}
get()
方法将直接返回实际的对象,因此调用tupleToObject()
将用实际的对象填充类别父对象。
private Category tupleToObject(Serializable[] tuple) {
Category category = new Category((String)tuple[1],
(YearMonthDay) tuple[2]);
category.setId((Long) tuple[0]);
category.setParent(lazyGet((Long) tuple[3]));
return category;
}
lazyGet()
方法实际上返回一个代理(而不是实际的对象)。代理上的第一个方法调用实际上将触发对象的加载。这里的代理用于延迟实际对象的实际检索,直到它真正需要时,即延迟加载。
希望这能回答你的问题。
https://stackoverflow.com/questions/17228106
复制相似问题