我正在阅读activejdbc的来源,在ModelInstrumentation中找到了这些方法。
public void instrument(CtClass modelClass) throws Exception {
addDelegates(modelClass);
CtMethod m = CtNewMethod.make("public static String getClassName() { return \"" + modelClass.getName()
+ "\"; }", modelClass);
CtMethod getClassNameMethod = modelClass.getDeclaredMethod("getClassName");
modelClass.removeMethod(getClassNameMethod);
modelClass.addMethod(m);
}
CtClass modelClass = ClassPool.getDefault().get("org.javalite.activejdbc.Model");
private void addDelegates(CtClass target) throws NotFoundException, CannotCompileException {
CtMethod[] modelMethods = modelClass.getDeclaredMethods();
CtMethod[] targetMethods = target.getDeclaredMethods();
for (CtMethod method : modelMethods) {
if (Modifier.PRIVATE == method.getModifiers()) {
continue;
}
CtMethod newMethod = CtNewMethod.delegator(method, target);
if (!targetHasMethod(targetMethods, newMethod)) {
target.addMethod(newMethod);
} else {
System.out.println("Detected method: " + newMethod.getName() + ", skipping delegate.");
}
}
}
此类用于增强模型类,第一个instrument
将首先将所有非私有方法从org.javalite.activejdbc.Model
委托给其子模型类,这意味着它会将此类方法添加到子:
public X f(...) {
return super.f(...);
}
我不明白为什么会这样做,因为即使没有代表,我们也可以调用这些方法。
答案 0 :(得分:2)
在此讨论中可以找到对此的解释:
https://groups.google.com/forum/#!topic/activejdbc-group/l6KNBi5EPc0
基本上,主要问题是我们在子类中需要的Model类中的方法是静态的。 Java中的静态类不是继承的。这意味着当你这样做时:
Person.where(...)
您将执行方法Model.where(),而不是Person.where(),因此框架不知道要查询哪个表。 ActiveJDBC强制将模型方法强制转换为子方法,以便在运行时确定要为数据转换的表。