HOT Deployと継承

スーパークラスのみ変更してサブクラスには変更がないときに、Hot Deployで変更が反映される場合とそうでない場合があるのでメモ。
まずスタートの状態は以下の通り。
aaa.html

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:te="http://www.seasar.org/teeda/extension" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<form id="aaaForm">
    <input type="text" id="hoge"/>
    <input type="submit" id="doFuga"/>
</form>
</body>
</html>

AbstractAaaPage.java

package hatena.hoge.web.aaa;

public abstract class AbstractAaaPage {

    private String hoge;

    public String getHoge() {
        return hoge;
    }

    public void setHoge(String hoge) {
        this.hoge = hoge;
    }

}

AaaPage.java

package hatena.hoge.web.aaa;

public class AaaPage extends AbstractAaaPage {

    public Class doFuga() {
        return null;
    }

    public Class initialize() {
        return null;
    }

    public Class prerender() {
        return null;
    }

}

これでページを表示させると空のテキストボックスとボタンが表示されます。
ここでAbstractAaaPageのgetterを

    public String getHoge() {
        return "hoge";
    }

としてボタンをクリックするとテキストボックスにhogeが表示されます。
(このときタイムスタンプはAbstractAaaPage.classのみが更新されている)

次にhogeプロパティをfooに変更し(AbstractAaaPageとaaa.htmlを修正)ボタンをクリックすると再びテキストボックスが空になります。
(このときタイムスタンプはAbstractAaaPage.classとaaa.htmlが更新されている)
htmlを見てみるとhtmlのidはfooに変更されています。

ここでTomcatを再起動します。すると今度はテキストボックスにhogeが表示されるようになります。

7/2追記

まとめると

  • スーパークラスだけ変更したとしてもクラス自体の変更はHot Deployで反映できる。
  • ただし、Pageの情報(プロパティやバリデーションの情報等)はその末端のクラスの.classのタイムスタンプが更新されていれば更新されるという仕様となっている(パフォーマンス確保のため)のでスーパークラスしか更新されていない場合はPage情報が更新されない。

ということのようです。