Home > Java | Seasar > 仮型引数を持つ関数を型引数を持つ関数でOverrideしたクラスからその関数をリフレクションで取得するとそれぞれ別の関数として見つかる

仮型引数を持つ関数を型引数を持つ関数でOverrideしたクラスからその関数をリフレクションで取得するとそれぞれ別の関数として見つかる


Buri + S2JDBC対応 ExampleのS2JDBCToDataAccessRule#insertでinsert関数が複数見つかる場合があったので試しにコード書いてみたらそうでした。Genericsはコンパイル時に型が解釈されるから当然なんだろうけど、普段コンパイルエラーで生成できないバイトコードが生成されるんですね。

以下、コードと実行結果。

  • S2AbstractService
// S2-TigerのS2AbstractServiceから抜粋
public abstract class S2AbstractService<T> {
    ... 省略 ...
    public int insert(T entity) {
        return jdbcManager.insert(entity).execute();
    }
    ... 省略 ...
}
  • AbstractService
public abstract class AbstractService<ENTITY> extends S2AbstractService<ENTITY> {
    public int insert(ENTITY entity) {
        return super.insert(entity);
    }
}
  • HogeService
public class HogeService extends AbstractService<Hoge> {
    @Override
    public int insert(Hoge hoge) {
        hoge.registTime = new Timestamp(new Date().getTime());
        return super.insert(hoge);
    }
    // insert(Hoge hoge)関数とObject型が重複するので自分で書くとコンパイルエラー
    // public int insert(Object object) {
    //     ...
    // }
}
  • 出力するためのコード、@Testついてるけど何もテストはしていない
@RunWith(Seasar2.class)
@RootDicon("app.dicon")
public class HogeServiceTest {
    @Test
    public void testFindInsertMethod() {
        Method methods[] = HogeService.class.getMethods();
        for (Method method : methods) {
            if (method.getName().startsWith("insert")) {
                System.out.println("# method: " + method.toGenericString());
            }
        }
        // Overrideされた関数があるかどうかを探します
        try {
            Method method =
                ClassUtil.getMethod(
                    HogeService.class,
                    "insert",
                    new Class[] { Hoge.class });
            if (method != null) {
                System.out.println("## found: " + method.toGenericString());
            }
        } catch (NoSuchMethodRuntimeException e) {
            System.out.println("## not found");
        }
    }
}
  • 出力結果
# method: public int org.example.service.HogeService.insert(org.example.entity.Hoge)
# method: public int org.example.service.HogeService.insert(java.lang.Object)
## found: public int org.example.service.HogeService.insert(org.example.entity.Hoge)

この記事に関連する別の記事:

  1. S2Struts HotDeployでActionConfigのパス修正への道 (4) ...
  2. Cubbyでアクションメソッドに指定するアノテーションの順番 しばらく時間が空いてからCubbyを使ったWEBアプリケーションを書く時に、アクションメソッドに指定するアノテーションの順番どうだったかなっと考えるのでまとめます。アノテーションなので適当な順番に書いても問題なく動作しま [...]...
  3. HOT deploy時のサブアプリケーションのServiceクラスの==コンポーネント名==setterのメソッド名 (解決) ...
  4. 1Action 1ActionFormを1Event 1ActionFormへ ...
  5. Cubbyのアクションクラスで定数を利用してリファクタリングしやすくする Cubbyのアクションクラスにはバリデーションルールの定義時やアノテーションに文字列が登場します。文字列で指定しているのでリファクタリングする時に修正漏れなどがおきそうでちょっと怖いです。そこで、それらの文字列を定数にし [...]...

コメント:0

コメントフォーム
Remember personal info

トラックバック:0

このエントリーのトラックバックURL
http://jfut.integ.jp/2009/03/13/%E4%BB%AE%E5%9E%8B%E5%BC%95%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E9%96%A2%E6%95%B0%E3%82%92%E5%9E%8B%E5%BC%95%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E9%96%A2%E6%95%B0%E3%81%A7override%E3%81%97%E3%81%9F/trackback/
Listed below are links to weblogs that reference
仮型引数を持つ関数を型引数を持つ関数でOverrideしたクラスからその関数をリフレクションで取得するとそれぞれ別の関数として見つかる from ふたつの川うるおう日記

Home > Java | Seasar > 仮型引数を持つ関数を型引数を持つ関数でOverrideしたクラスからその関数をリフレクションで取得するとそれぞれ別の関数として見つかる

検索
フィード
メタ情報

Return to page top