Как понять этого делегата - PullRequest
       11

Как понять этого делегата

1 голос
/ 14 сентября 2011

Я читаю источник 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(...);
}

Я не понимаю, почему этоделает это, так как мы можем вызывать эти методы, даже если нет делегатов.

1 Ответ

2 голосов
/ 14 сентября 2011

Объяснение этого можно найти в этом обсуждении:

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

По сути, основная проблема заключается в том, что методы в классе Model, которые нам нужны в дочернем классе, являются статическими. Статические классы в Java не наследуются. Это означает, что когда вы делаете это:

Person.where(...)

Вы будете выполнять метод Model.where (), а не Person.where (), поэтому среда не будет знать, какую таблицу запрашивать. ActiveJDBC переводит методы модели в дочерние методы, чтобы во время выполнения определить, к какой таблице обращаться к данным.

...