質問: ``` public class Base { public final int zzz; public Base() { } public Base(int a, int b, int c) { //長い処理 } } public class Derived extends Base { } ``` このような関係になっているときに、Baseクラスのpublic final intフィールドzzzをDerivedクラスで初期化することはできますでしょうか。 Base(int,int,int)コンストラクタは、Baseクラスをそのまま使うときに呼び出すものですのでDerivedから呼ぶことはできません。 DerivedクラスではBaseクラスの初期化処理だけを変更して、それ以外のメソッドはそのまま流用したいという使い方をしたいと思っています。 BaseクラスのBase()コンストラクタでzzzに何の値も入れないと怒られますし、Derivedクラスではzzzに値を入れることができないという状態です。 クラス構造を変更するしか方法がないのでしょうか? よろしくお願いします。
回答: 行儀の悪いコードであることは百も承知ですが、当初やりたかったことは Javaのリフレクションを用いることにより実現できました。 ``` import java.lang.reflect.Field; class Base { public final int zzz; public Base() { // dummy zzz = 0; } public Base(int a, int b, int c) { // 長い処理 zzz = 123; } } class Derived extends Base { public Derived() { try { Field f = getClass().getSuperclass().getDeclaredField("zzz"); f.setAccessible(true); f.set(this, 345); // 新しい値を設定 } catch (NoSuchFieldException | SecurityException | IllegalAccessException e) { e.printStackTrace(); } } public static void main(String[] args) { Derived der = new Derived(); System.out.println(der.zzz); } } ```