継承された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にするか(インターフェースには追加しない)、サブクラスで必ず全行数の取得を行うメソッドをオーバーライドするかじゃな。