javassist を使って、MyFaces ブリッジを作っていたのだが、RenderResponse の実装にデフォルトのコンストラクタみたいなのがない場合に、自動処理が難しいと感じ始める・・・。次のような場合、
public class App { public static void main(String[] args) { Test3 a = new Test3(); } } class Test1 { public Test1() { System.out.println("Test1のコンストラクタです。"); } } class Test2 extends Test1 { public Test2() { System.out.println("Test2のコンストラクタです。"); } } class Test3 extends Test2 { public Test3() { System.out.println("Test3のコンストラクタです。"); } }
実行すると
Test1のコンストラクタです。 Test2のコンストラクタです。 Test3のコンストラクタです。
となるわけだが、もし、Test2クラスでTest2()がTest2(int a)とかに変わった場合、Test3のコンストラクタでコンパイルエラーになる。そのため、Test3のコンストラクタでは、次のように、明示的にsuper(1)とかTest3()でやらねばならない。
public class App { public static void main(String[] args) { Test3 a = new Test3(); } } class Test1 { public Test1() { System.out.println("Test1のコンストラクタです。"); } } class Test2 extends Test1 { public Test2(int a) { System.out.println("Test2のコンストラクタです。"); } } class Test3 extends Test2 { public Test3() { super(1); System.out.println("Test3のコンストラクタです。"); } }
つまり、やりたかったことは、RenderResponse(ここではTest2クラスを想定)を動的にラップするクラス(つまりTest3クラス)を作りたかったのだが、Test2 にデフォルトのコンストラクタがない場合は、super(..)を呼び出せねばならない。適当な引数を渡して、とりあえず、インスタンス化すればいいかとも思うが、PlutoやJ2の場合、ServletResponseWrapperなどが親にいるから、適当なresponseをコンストラクタに渡すとExceptionをくらってしまう。
うむむ、何か他に方法があるのだろうか。javassistの知識も深まったけど、結局、この方法でも解決できなそうな気がしてきた・・・。