私は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.");
}
}
}
このクラスは、モデルクラスを強化するために使用され、最初の1 instrument
は、まず、それが子供に、このようなメソッドを追加することを意味し、その子モデルクラスにorg.javalite.activejdbc.Model
からすべての非プライベートメソッドを委譲します:
public X f(...) {
return super.f(...);
}
デリゲートが存在しない場合でも、これらのメソッドを呼び出すことができるため、なぜこれを行うのかわかりません。この