2011-09-14 9 views
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."); 
     } 
    } 

} 

このクラスは、モデルクラスを強化するために使用され、最初の1 instrumentは、まず、それが子供に、このようなメソッドを追加することを意味し、その子モデルクラスにorg.javalite.activejdbc.Modelからすべての非プライベートメソッドを委譲します:

public X f(...) { 
    return super.f(...); 
} 

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

答えて

2

説明は、この説明に見つけることができます:

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

基本的には、主な問題は、我々は、子クラスに必要なモデルクラスのメソッドは静的であるということです。 Javaの静的クラスは継承されません。

Person.where(...) 

あなたは、したがって、フレームワークは、照会するためのどのようなテーブルは考えているだろう、)Person.where(、)(メソッドModel.whereではなく実行されます。これは、あなたがこれを行うとすることを意味します。 ActiveJDBCモデルメソッドを子メソッドに強制し、実行時にデータのためにどのテーブルに移動するかを決定します。