1

私は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(...);
}

デリゲートがなくてもこれらのメソッドを呼び出すことができるため、なぜこれを行うのかわかりません。

4

1 に答える 1

2

これの説明はこの議論で見つけることができます:

https://groups.google.com/forum/#!topic/activejdbc-group/l6KNBi5EPc0

基本的に、主な問題は、子クラスで必要なModelクラスのメソッドが静的であるということです。Javaの静的クラスは継承されません。これは、これを行うと次のことを意味します。

Person.where(...)

Person.where()ではなくModel.where()メソッドを実行するため、フレームワークはクエリするテーブルを認識できません。 ActiveJDBCは、実行時にデータの移動先テーブルを決定するために、モデルメソッドを子メソッドに強制します。

于 2011-09-14T16:26:45.047 に答える