S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

継承されたprotecedなAccessibleObject(Filed, Method, Constructor)が取得できない

java.lang.Class#getDeclared*は、そのクラスで実装されたAccessibleObjectしか取得できん。
java.lang.Class#get*は、継承されたAccessibleObjectが取得できるけど、publicなAccessibleObjectしか取得できんし。
ということで「呼ばれたメソッド名から、命名ルールに従った別のprotectedなメソッドを呼び出す」みたいなことができないのね。


やりたいシチュエーションはこんな感じ。
AbstractなDAOクラスで、リストの取得でページングがある場合は、全行数の取得を行う、みたいなこと。
メソッドの命名ルールとしては、getHogeListから呼ばれると、ページングの有無により全行数を取得するgetHogeListCountを呼び出す、って感じ。

// ページングする場合は全行数を取得する
if (isPaging() == true) {
    // 呼び出し元のメソッド名を取得(スタックトレースの1つ前のメソッド名)
    String prevMethodName = new Throwable().getStackTrace()[1].getMethodName();
    try {
        // 「呼び出し元のメソッド名+Count」メソッドで全行数を取得【ここでprotecedなメソッドが取得できない】
	// Method countMethod = this.getClass().getDeclaredMethod(prevMethodName + "Count", new Class[] { Map.class });
	Method countMethod = this.getClass().getMethod(prevMethodName + "Count", new Class[] { Map.class });
        if (countMethod != null) {
            // 全行数を取得
            Object cnt = countMethod.invoke(this, new Object[] { selectMap });
            criteria.getPagingCriteria().setTotalRowCount(((Integer) cnt).intValue());
        }
    } catch (NoSuchMethodException e) {
        // 全行数を取得するメソッドが存在しない
    }
}


SQLServerにはLIMIT-OFFSETはありません。今日知りました(爆
でもみんなサンプルのLIMIT-OFFSETの記述をコピペして、動作確認してないときてる(涙
そのくせアホみたいにDAOクラスは出来上がってしまっているのです(大涙


ページングのような非機能要件はAbstractみたいな所で吸収したいので、全行数の取得を行うメソッドをpublicにするか(インターフェースには追加しない)、サブクラスで必ず全行数の取得を行うメソッドをオーバーライドするかじゃな。